2009-08-05 8 views
9

Salut tout le monde, j'utilise le multitraitement en python maintenant. et je me demande simplement s'il existe une sorte de variable de compteur simple que chaque processus quand ils ont fini de traiter une tâche pourrait juste augmenter (genre de combien de travail fait au total).Multiprocessing Python moyen facile de mettre en œuvre un compteur simple?

J'ai regardé l'API pour la valeur, ne pense pas que c'est mutable.

Répondre

23

Value est en effet mutable; vous spécifiez le type de données souhaité à partir du module ctypes, puis il peut être muté. Voici un script de travail complet, qui démontre ceci:

from time import sleep 
from ctypes import c_int 
from multiprocessing import Value, Lock, Process 

counter = Value(c_int) # defaults to 0 
counter_lock = Lock() 
def increment(): 
    with counter_lock: 
     counter.value += 1 

def do_something(): 
    print("I'm a separate process!") 
    increment() 

Process(target=do_something).start() 
sleep(1) 
print counter.value # prints 1, because Value is shared and mutable 

EDIT: Luper fait remarquer à juste titre dans un commentaire ci-dessous que Value valeurs sont verrouillées par défaut. Ceci est correct dans le sens où même si une assignation consiste en plusieurs opérations (comme l'assignation d'une chaîne pouvant contenir plusieurs caractères) alors cette assignation est atomique. Cependant, lors de l'incrémentation d'un compteur, vous aurez toujours besoin d'un verrou externe comme indiqué dans mon exemple, car l'incrémentation charge la valeur actuelle, puis l'incrémente, puis affecte le résultat au Value.

donc sans verrou externe, vous pourriez courir dans les circonstances suivantes:

  • Processus 1 lit (atomiquement) la valeur courante du compteur, puis l'incrémente
  • avant que le processus 1 peut affecter le incrémentée compteur à la Value, un changement de contexte occurrs
  • Procédé 2 lit (atomiquement) la valeur actuelle (non incrémentée) du compteur, par incréments, et affecte le résultat incrémenté (atomiquement) retour au Value
  • Le processus 1 affecte sa valeur incrémentée (de manière atomique), en soufflant l'incrément effectué par le processus 2
+2

Les accès de valeur sont protégés par un verrou par défaut. –

+0

Vous avez besoin de "from __future__ import with_statement" ici, non? –

+0

@Edward: Vous avez besoin de l'importation future si vous utilisez Python 2.5, j'utilisais Python 2.6 quand j'ai écrit ce code, donc c'était inutile. –

Questions connexes