Ruby 3 引入了 Fiber.schedule
来同时分派异步任务。
类似于这个问题所提出的(关于线程并发性),我想要在纤程调度器上启动多个并发任务,并一旦它们都被安排等待它们的组合结果,有点类似于JavaScript中的Promise.all
。
我能想到这种幼稚的方式:
require 'async'
def io_work(t)
sleep t
:ok
end
Async do
results = []
[0.1, 0.3, 'cow'].each_with_index do |t, i|
n = i + 1
Fiber.schedule do
puts "Starting fiber #{n}\n"
result = io_work t
puts "Done working for #{t} seconds in fiber #{n}"
results << [n, result]
rescue
puts "Execution failed in fiber #{n}"
results << [n, :error]
end
end
# await combined results
sleep 0.1 until results.size >= 3
puts "Results: #{results}"
end
有更简单的结构可以完成同样的功能吗?
Async::Barrier
是一个好主意,因为它会特别跟踪任务执行,并且Async::Barrier#wait
将等待直到所有任务完成。这与使用Thread::Queue
不同,在那里您需要以某种方式通知父任务所有工作都已完成。 - ioquatix