17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

qsize()<br />

Renvoie la taille actuelle de la pile.<br />

empty()<br />

Renvoie True si la pile est vide.<br />

Bonnes pratiques et optimisation du code<br />

CHAPITRE 13<br />

full()<br />

Renvoie True si la pile est pleine.<br />

Classiquement, un objet Queue est utilisé lorsque le Producteur de données n’est pas maîtrisé<br />

et que le programme doit se mettre en attente de ces données pour pouvoir lancer un<br />

traitement. Un exemple complet est implémenté dans l’exercice 8 du chapitre 11.<br />

Le Global Interpreter Lock et multiprocessing<br />

Le code même de l’interpréteur Python n’est pas thread-safe et un lock général existe<br />

pour empêcher plusieurs threads de modifier des registres en même temps. Il s’agit<br />

du Global Interpreter Lock, ou GIL.<br />

À cause du GIL, les threads ne sont pas réellement capables de fonctionner totalement<br />

en parallèle, sauf lorsqu’ils utilisent du code C ou qu’ils appellent des programmes<br />

externes.<br />

Les performances de la programmation par threads en Python sont donc très limitées,<br />

et les programmes ne sauront pas tirer parti d’une architecture multi-processus.<br />

Cette limitation se ressent par exemple dans les serveurs d’applications codés en<br />

Python qui tournent sur un serveur multi-processeur : ils utilisent 100 % d’un processeur<br />

à forte charge et ne tirent pas partie du deuxième. Malgré les différents travaux<br />

de membres de la communauté pour supprimer le GIL, l’implémentation<br />

actuelle de CPython ne changera pas car une récriture importante est à envisager.<br />

La solution la plus simple pour contourner ce problème est d’utiliser des processus au<br />

lieu de threads. C’est ce qu’offre le module multiprocessing. Ce module, introduit<br />

dans Python 2.6, mais également backporté dans Python 2.4 et 2.5, permet de manipuler<br />

des processus avec des fonctions et des classes similaires.<br />

La méthode la plus souple consiste à utiliser la classe Pool fournie par le module pour<br />

y placer des travaux indépendants à réaliser. multiprocessing gère alors la création<br />

des processus, leur gestion et la récupération des résultats de manière totalement<br />

transparente.<br />

463

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!