Gem Parallel 并行执行任务的坑

tinyfeng · 2020年04月23日 · 4515 次阅读
@a = 2
# =>  2

Parallel.each(1..3) do |i|
    puts @a
end
# =>  2
# =>  2
# =>  2

Parallel.each(1..3) do |i|
    @a = @a + i
end
# => 1..3

@a
# => 2

在任务里能访问到共享资源 (@a),但无法对其修改,应该是防止共享资源竞争导致不期望的情况发生。

删除线欲对其进行修改,应使用 map 方法,自己手动对执行完的结果进行处理。

用 in_threads 可以解决这个问题,但是不确定多线程资源竞争的时候,是否安全

Parallel.each(1..3,  in_threads: 3) do |i|
    @a = @a + i
end
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号