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