Table des matières

Python

GIL

GIL (Global Interpreter Lock) est le verrou global de Python. Je le compare à un un mutex.

Python ne peux pas gérer plusieurs contextes d'éxecution en même temps. Les threads sont donc géré par un ordonanceur logique. Dans tout les cas les flôts de contrôles se comporteront comme sur un environement monocore.

Le GIL est donc utilisé pour implémenter cet ordonanceur. Quand un thread veux s'executer il prend le GIL et se bloque si il n'est pas libre. Quand le flôt de contrôle a fait un certain nombre de bytecode, il relache le GIL. Ainsi le GIL peut être pris par un autre flôt de contrôle, ou celui qui a relaché le GIL.

Pause

Quand un flôt de contrôle se bloque sur une E/S ou sur un sleep() le GIL est libéré. En fait dans l'API Python, appeller time.sleep() ou accéder à un fichier va se relacher le GIL. C'est écrit dans les fonctions. Quand le flôt de contrôle pourra reprendre le cours de sa vie, il essaira de prendre le GIL. On retourne alors dans la configuration décrite plus haut.

Problème

Si on fait des appels systèmes qui arrète le flôt de contrôle (Dans un module écrit en C concraitement), le GIL n'est pas libéré. Un flôt de contrôle qui lance un tel appel bloquera toute l'exécution du script Python.

Il est donc nécessaire dans le C de libérer et de prendre explicitement le GIL. Le code critique doit être englobé par deux Macros qui se chargent du travail. Ces macros sont dans l'API Python.

#include<Python.h>
 
//...
 
  /* Release GIL (Python) */  
  Py_BEGIN_ALLOW_THREADS
 
  /* CODE CRITIQUE */
 
  /* Get GIL (Python) */  
  Py_END_ALLOW_THREADS
//...

 
prog/python.txt · Dernière modification: 2009/06/04 20:07 par trizolakai
 
Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki