Ruby 2.7 搭配 Async gem 1.x 版本无法并行执行任务的问题求助
大家好,我最近碰到个头疼的问题,想请教下社区里的大佬们:
我正在用Ruby 2.7开发,因为这个版本只支持Async gem的1.x系列,所以安装了该分支的最新版本1.31.0。
按照官方文档里的简单示例写了一段代码,预期是3个子任务并行执行,1秒就能完成,但实际运行下来却是串行执行,总共花了3秒才结束。有意思的是,同样的代码放到Ruby 3.1+最新版Async gem(2.6.1)上跑,就完全符合预期——并行执行,1秒搞定。
我一开始以为是gem的bug,卸载后试了好几个更早的1.x版本,结果都一样,所以现在我觉得可能是自己对Async 1.x版本的用法理解有误,而不是gem本身的问题。
我的测试代码如下:
require "async" Async do 3.times do |i| Async do sleep 1 puts "Hello World #{i}" end end end
后来我做了个小调整,发现用task.sleep替代普通的sleep时,所有的睡眠操作确实能并行执行,但这感觉像是个特殊情况(是不是调用了gem提供的专属sleep方法?)
于是我又写了一个更贴近真实业务场景的计算密集型例子,结果还是串行执行:
Async do |task| 3.times do |i| Async do start = Time.now puts "starting task #{i} at #{start.to_f}" (0..1000000/((i+1)*10000)).reduce(:*) done = Time.now puts "finished task #{i} at #{done.to_f}, took #{done - start}" end end end
这段代码的运行输出如下:
starting task 0 at 1686603935.7939696
finished task 0 at 1686603935.7940578, took 8.799e-05
starting task 1 at 1686603935.7941055
finished task 1 at 1686603935.7941372, took 3.1856e-05
starting task 2 at 1686603935.7941997
finished task 2 at 1686603935.7942228, took 2.3047e-05
目前我还没来得及在Ruby 3.1+Async 2.x版本上测试这个计算密集型的例子,想先问问大家有没有遇到过类似的情况,或者有没有关于Async 1.x版本并行执行的要点我没注意到?
备注:内容来源于stack exchange,提问作者nPn

