2

Je suis un débutant en multiprocessing, quelqu'un peut-il me dire pourquoi cela ne produit aucune sortie?Pas de sortie de processus utilisant le multi-traitement

import multiprocessing 

def worker(num): 
    """thread worker function""" 

    print('Worker:', num) 

if __name__ == '__main__': 
    jobs = [] 

    for i in range(4): 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
+0

[semble fonctionner très bien.] (Https://ideone.com/jT84Ar) –

+0

exécutez-vous votre code de manière interactive ou comme un script (par exemple 'python de myscript.py')? – robyschek

+0

fonctionne comme un script fonctionne. – user128751

Répondre

0

Vous devez probablement vider la sortie. Vous pouvez utiliser sys.stdout.flush():

import multiprocessing 
import sys 

def worker(num): 
    """thread worker function""" 
    print('Worker:', num) 
    sys.stdout.flush() 
    return 

if __name__ == '__main__': 
    jobs = [] 
    for i in range(4): 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
+0

Cela n'a pas aidé! – user128751

+0

Vous pouvez essayer de le mettre dans la boucle for ou après - pour moi, cela fonctionne sans flush. – rofls

+0

@ user128751 Comment fonctionne le programme? Terminal, interprète, IDE? – rofls

1

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.

+0

en cours d'exécution en tant que script de travail, mais en utilisant IDLE, cela ne fonctionne pas. – user128751

+0

Chose étrange. Dans ipython lorsque j'exécute le ** code avec join ** après le ** code sans rejoindre ** les messages manquants du ** code sans jointure ** sont également vidés. Il ne s'agit donc pas d'une sortie prématurée, mais de la mise en cache de stdout dans ipython. – robyschek

+0

Trouvé, voir mon édition! – Will