Cython nogil
Cython 是另一種 python 直譯器。它使用 GIL,但允許你禁用它。檢視他們的文件
舉個例子,使用 David Beazley 首先用於顯示執行緒對 GIL 的危險的程式碼 ,我們將使用 nogil 重寫它:
David Beazley 的程式碼顯示了 GIL 執行緒問題
from threading import Thread
import time
def countdown(n):
while n > 0:
n -= 1
COUNT = 10000000
t1 = Thread(target=countdown,args=(COUNT/2,))
t2 = Thread(target=countdown,args=(COUNT/2,))
start = time.time()
t1.start();t2.start()
t1.join();t2.join()
end = time.time()
print end-start
使用 nogil 重寫(僅在 CYTHON 中工作):
from threading import Thread
import time
def countdown(n):
while n > 0:
n -= 1
COUNT = 10000000
with nogil:
t1 = Thread(target=countdown,args=(COUNT/2,))
t2 = Thread(target=countdown,args=(COUNT/2,))
start = time.time()
t1.start();t2.start()
t1.join();t2.join()
end = time.time()
print end-start
就這麼簡單,只要你使用 cython。請注意,文件說你必須確保不要更改任何 python 物件:
語句正文中的程式碼不得以任何方式操作 Python 物件,並且在不首先重新獲取 GIL 的情況下不得呼叫任何操作 Python 物件的東西。Cython 目前不檢查這個。