動機
python與ruby上用thread必要面對的課題
GIL為什麼要存在
- 省下替各個資料結構上鎖的煩惱
- 在call C extension時不會出事
- 如果只有語言自己的原生method調用,基本上可以當成thread-safe來使用 (python有保證,ruby在MRI也有)
缺點
- 只有一個thread可以在interpreter計算 (就是替{整個}interpreter加鎖,這效能只有單線程能看,多線程就是各thread競爭到死)
- 不是說有GIL替thread加鎖就不用煩惱race condition的問題 (都有實作timer來搶GIL,如果配上自己的code不是只有語言自己的原生的東西的話就會出事,見下面的code)
- 使用OS級的thread卻沒有發揮OS級的thread的效能
- GIL怎麼被搶,是看各個interpreter的實作,完全不知道什麼時候、情況下發生(有的是時間,有的是bytecode太長)
sheep = false
5.times.map do
Thread.new do
unless sheep
sheep = true
print("DONE")
end
end
end.each(&:join)
sheep = Sheep.new
5.times.map do
Thread.new do
unless sheep.shorn?
sheep.shear!
end
end
end.each(&:join)
如何相處
- 好好地上鎖或是用blocking queue
- 在IO重的code上用thread,這正是唯一能享受到多線程好處的地方
- 用fork….. 或用 C…..
Ref
Ruby 无人知晓的 GIL 深入 GIL: 如何寫出快速且 thread-safe 的 Python Python的GIL是什么鬼,多线程性能究竟如何 See also: Green_threads