【发布时间】:2022-12-11 11:06:13
【问题描述】:
Ruby 3 引入了Fiber.schedule 来同时分派异步任务。
与this question(关于线程并发)中的问题类似,我想要一种在纤程调度程序上启动多个并发任务的方法,一旦它们都被安排好等待它们的组合结果,有点等同于Promise.all在 JavaScript 中。
我可以想出这种天真的方法:
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
有没有更简单的结构可以做同样的事情?
【问题讨论】:
标签: ruby asynchronous concurrency fibers ruby-3