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 目前不检查这个。