Ruby3引入了Fiber.schedule
来并发分派异步任务.
类似于this question中提出的问题(这是关于线程并发的),我想要一种在纤程调度器上启动多个并发任务的方法,一旦它们都被调度好,就等待它们的组合结果,这在某种程度上相当于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
有没有一种更简单的 struct 可以起到同样的作用?