動機

python與ruby上用thread必要面對的課題

GIL為什麼要存在

  1. 省下替各個資料結構上鎖的煩惱
  2. 在call C extension時不會出事
  3. 如果只有語言自己的原生method調用,基本上可以當成thread-safe來使用 (python有保證,ruby在MRI也有)

缺點

  1. 只有一個thread可以在interpreter計算 (就是替{整個}interpreter加鎖,這效能只有單線程能看,多線程就是各thread競爭到死)
  2. 不是說有GIL替thread加鎖就不用煩惱race condition的問題 (都有實作timer來搶GIL,如果配上自己的code不是只有語言自己的原生的東西的話就會出事,見下面的code)
  3. 使用OS級的thread卻沒有發揮OS級的thread的效能
  4. 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)

如何相處

  1. 好好地上鎖或是用blocking queue
  2. 在IO重的code上用thread,這正是唯一能享受到多線程好處的地方
  3. 用fork….. 或用 C…..

Ref

Ruby 无人知晓的 GIL 深入 GIL: 如何寫出快速且 thread-safe 的 Python Python的GIL是什么鬼,多线程性能究竟如何 See also: Green_threads