Python GIL

Richard-T發表於2017-04-26
  1. Python 中一個執行緒對應於C語言中的一個執行緒
  2. GIL 使得同一時刻只有一個執行緒在一個CPU核心上執行位元組碼。我們只要執行一個Python程式,不管裡面有多少個執行緒,都只能執行在一個CPU核心上,而像JAVA,C等可以將多個執行緒對映到多個CPU核心上。無法將多個執行緒對映到多個CPU上,這樣就無法體現CPU多核的優勢,併發就非常受限

一個時刻只有一個執行緒執行在CPU上,那編寫多執行緒是不是不用考慮執行緒間同步?

看這個例子:

import threading

total = 0

def add():
    global total
    for i in range(1000000):
        total += 1

def desc():
    global total
    for i in range(1000000):
        total -=1


thread1 = threading.Thread(target=add)
thread2 = threading.Thread(target=desc)
thread1.start()
thread2.start()

thread1.join()
thread2.join()

print(total)

total 的值,每次執行都不一樣,說明GIL在某些時候會釋放

GIL在什麼時候會釋放?

  1. GIL 會根據執行的位元組碼行數以及時間片釋放GIL
  2. 遇到IO操作會釋放

相關文章