2010-08-04 5 views
15

Je ne comprends pas pourquoi ce code simplePython multitraitement génère en continu des processus pythonw.exe sans faire aucun travail réel

# file: mp.py 
from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

p = Process(target= func, args= (2,)) 
p.start() 
p.join() 
p.terminate() 
print 'done' 
sys.stdout.flush() 

crée « pythonw.exe » processus continu et il n'imprime rien, même si je le lance à partir de la ligne de commande:

python mp.py 

Je courais la dernière de Python 2.6 sur Windows 7 32 et 64 bits

+0

Quelle est la sortie alors qu'il est en cours d'exécution? –

+0

pas de sortie du tout – lj8888

Répondre

32

Vous devez protect then entry point of the program by using if __name__ == '__main__':.

Il s'agit d'un problème spécifique à Windows. Sous Windows, votre module doit être importé dans un nouvel interpréteur Python afin qu'il accède à votre code cible. Si vous n'arrêtez pas ce nouvel interpréteur en exécutant le code de démarrage, il engendrera un autre enfant, qui engendrera alors un autre enfant, jusqu'à ce que ce soit pythonw.exe processus à perte de vue.

Les autres plates-formes utilisent os.fork() pour lancer les sous-processus afin de ne pas avoir à réimporter le module.

Donc, votre code devra ressembler à ceci:

from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

if __name__ == '__main__': 
    p = Process(target= func, args= (2,)) 
    p.start() 
    p.join() 
    p.terminate() 
    print 'done' 
    sys.stdout.flush() 
+1

un tel détail facile, si facile à manquer qui a fonctionné, merci – lj8888

+1

Ce threaad a été un épargnant de vie, mon script python simple générait "zillions" de pythonw.exe et provoquait une surcharge et une chute de Windows. Merci! – Hornbydd

1

drôle, fonctionne sur ma machine Linux:

$ python mp.py 
works 4 
done 
$ 

Le multitraitement est-il supposé fonctionner sous Windows? Beaucoup de programmes créés dans le monde Unix ne gèrent pas Windows aussi bien, parce que Unix utilise fork(2) pour cloner des processus assez bon marché, mais (d'après ce que j'ai compris) que Windows ne supporte pas fork(2) gracieusement, voire pas du tout.

+5

Windows ne prend pas en charge fork donc doit lancer un nouvel interpréteur Python et réimporter le module, c'est-à-dire votre script. Si vous n'avez pas protégé votre code de démarrage avec 'if __name__ == '__main __':' alors il est exécuté par le processus fils, ce qui n'est pas bon. –

+2

... qui est géré par le processus enfant de l'enfant, qui est géré par le processus de l'enfant de l'enfant, qui ... – PaulMcG

Questions connexes