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 目前不檢查這個。