Python Language Cython nogil:


Exemple

Cython est un interpréteur Python alternatif. Il utilise le GIL, mais vous permet de le désactiver. Voir leur documentation

À titre d'exemple, en utilisant le code que David Beazley a utilisé pour montrer les dangers des threads contre le GIL , nous allons le réécrire en utilisant nogil:

Le code de David Beazley qui a montré des problèmes de thread 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

Réécrit en utilisant nogil (SEULEMENT FONCTIONNE À 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

C'est si simple, tant que vous utilisez cython. Notez que la documentation indique que vous devez vous assurer de ne modifier aucun objet python:

Le code dans le corps de l'instruction ne doit en aucun cas manipuler les objets Python, et ne doit rien appeler qui manipule les objets Python sans avoir préalablement racheté le GIL. Cython ne vérifie pas actuellement cela.