Je vais avoir des problèmes avec le module de multitraitement. J'utilise un pool de travailleurs avec sa méthode map pour charger des données à partir de beaucoup de fichiers et pour chacun d'eux j'analyse des données avec une fonction personnalisée. Chaque fois qu'un fichier a été traité, j'aimerais qu'un compteur soit mis à jour afin que je puisse garder une trace du nombre de fichiers à traiter. est un exemple de code ici:Python multitraitement et un compteur partagé
def analyze_data(args):
# do something
counter += 1
print counter
if __name__ == '__main__':
list_of_files = os.listdir(some_directory)
global counter
counter = 0
p = Pool()
p.map(analyze_data, list_of_files)
Je ne peux pas trouver une solution pour cela.
Bonne réponse! J'ai eu le même problème dans IronPython, et tandis que multiprocessing.Value n'est pas disponible, vous pouvez faire quelque chose de similaire avec clr.Reference et System.Threading.Interlocked: http://stackoverflow.com/questions/2255461/how-to-atomically- increment-a-static-member-in-ironpython/2314858 # 2314858 –
@jkp, comment le feriez-vous sans la variable globale? - J'essaie d'utiliser une classe, mais ce n'est pas aussi facile que ça en a l'air. Voir http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma – Anna
Malheureusement, cet exemple semble être imparfaite, puisque 'counter.value + = 1 'n'est pas atomique entre les processus, donc la valeur sera erronée si elle est exécutée assez longtemps avec quelques processus –