Gem Parallel 并行执行任务的坑

tinyfeng · April 23, 2020 · 4515 hits
@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
No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.