@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