Vous commencez votre Process()
, mais jamais en attente sur elle pour terminer, si se termine l'exécution de votre programme avant que le processus d'arrière-plan se termine. Essayez ceci, avec un appel à Process.join()
:
import multiprocessing
import sys
def worker(num):
"""thread worker function"""
print('Worker:', num)
sys.stdout.flush()
if __name__ == '__main__':
jobs = []
for i in range(4):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
map(lambda p: p.join(), jobs)
Ici, nous utilisons map()
pour appeler join()
sur chaque processus dans la liste jobs
.
Voici un exemple de ce travail:
In [127]: %paste
import multiprocessing
import sys
def worker(num):
"""thread worker function"""
print('Worker:', num)
sys.stdout.flush()
if __name__ == '__main__':
jobs = []
for i in range(4):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
map(lambda p: p.join(), jobs)
## -- End pasted text --
Worker: 2
Worker: 1
Worker: 0
Worker: 3
In [128]:
Quant à savoir pourquoi cela ne fonctionne pas en mode d'attente, voir this answer:
Cependant, pour voir la sortie print
, au moins sous Windows , il faut démarrer IDLE à partir d'une console comme ça.
C:\Users\Terry>python -m idlelib
hello bob
(utilisation idlelib.idle
sur 2.x) La raison en est que IDLE exécute le code d'utilisateur dans un processus séparé. Actuellement, la connexion entre le processus IDLE et le processus de code utilisateur se fait via une socket. La fourche effectuée par multiprocessing ne duplique pas ou n'hérite pas de la connexion socket. Lorsque IDLE est démarré via une icône ou un explorateur (sous Windows), il n'y a pas d'endroit où la sortie d'impression doit se rendre. Lorsqu'elle est démarrée à partir d'une console avec python
(plutôt que pythonw
), la sortie va à la console, comme ci-dessus.
[semble fonctionner très bien.] (Https://ideone.com/jT84Ar) –
exécutez-vous votre code de manière interactive ou comme un script (par exemple 'python de myscript.py')? – robyschek
fonctionne comme un script fonctionne. – user128751