Actions
Bug #20346
openFiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
Description
When using a Ractor.take
inside a different thread, Thread#join
on the thread running Ractor.take
fails to call FiberScheduler.unblock
. The below code can replicate this behavior
require "async"
class RactorWrapper
def initialize
@ractor = Ractor.new do
Ractor.recv # Ractor doesn't start until explicitly told to
# Do some calculations
fib = ->(x) { x < 2 ? 1 : fib.call(x - 1) + fib.call(x - 2) }
fib.call(20)
end
end
def take_async
@ractor.send(nil)
Thread.new { @ractor.take }.join.value
end
end
Async do |task|
10000.times do |i|
task.async do
RactorWrapper.new.take_async
puts i
end
end
end
The above code deadlocks, and when we leave a debugging print statement inside of Async
's scheduler's block
and unblock
method, we can confirm that we only call Scheduler.block
, and never Scheduler.unblock
Updated by jpcamara (JP Camara) 6 months ago
Looks as though the fiber scheduler is not supported by Ractors right now, due to fixes that need to be implemented in the Ractor API. Not clear if it is expected to be fixed for 3.4 or not.
Actions
Like1
Like0