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.

Bob est en train de faire les calculs<br />

4 3 2 1 0<br />

voici Bob<br />

Bob: je sais pas<br />

Bonnes pratiques et optimisation du code<br />

CHAPITRE 13<br />

Lorsque plusieurs threads se partagent des ressources, il est nécessaire de protéger le<br />

code par des points de synchronisation. Le module thread fournit des fonctions de<br />

création de verrous, encapsulées par deux objets de threading : Lock et Rlock.<br />

class Lock()<br />

Crée une nouvelle primitive de synchronisation. Deux méthodes sont ensuite<br />

accessibles : acquire() et release().<br />

acquire([blocking=1])<br />

Acquiert le verrou et renvoie True en cas de succès. Si blocking est à 1 ou n’est pas<br />

spécifié, l’appel de cette méthode bloque le thread si le verrou est déjà locké par un<br />

autre thread. Si blocking est à 0, acquire() se contente de renvoyer False pour<br />

signaler que le verrou est déjà pris.<br />

release()<br />

Libère le verrou, autorisant d’autres threads à le reprendre. Si plusieurs threads sont<br />

en attente de ce verrou, un seul thread est autorisé à l’acquérir. Appeler cette<br />

méthode sur un verrou qui n’est pas fermé lève une exception.<br />

La classe Rlock est identique mais permet au thread qui a le verrou de rappeler la<br />

méthode acquire() sans provoquer de deadlock. Cette variation simplifie grandement<br />

la conception du code, surtout lorsque des fonctions récursives entrent en jeu.<br />

Rlock est un lock réentrant.<br />

L’exemple ci-dessous définit une liste globale manipulée par plusieurs instances du<br />

thread Manipe. La suppression et l’ajout d’éléments dans la liste doivent se faire de<br />

manière protégée.<br />

Un verrou est donc associé à la liste et le code du thread l’utilise pour protéger la<br />

modification de la liste. Un bloc try..finally permet de s’assurer que le verrou est<br />

toujours libéré.<br />

Implémentation d’une section critique<br />

#!/usr/bin/python<br />

# -*- coding: utf8 -*from<br />

threading import Thread, Lock<br />

from time import sleep<br />

from sys import stdout<br />

457

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

Saved successfully!

Ooh no, something went wrong!