You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby 2.7 搭配 Async gem 1.x 版本无法并行执行任务的问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 09:18:08