2016-02-09 7 views
3

Un exemple de base de classe de processus multitraitement s'exécute lorsqu'il est exécuté à partir du fichier, mais pas à partir de IDLE. Pourquoi est-ce et peut-il être fait?La classe de processus multiprocessing peut être exécutée à partir de IDLE

from multiprocessing import Process 

def f(name): 
    print('hello', name) 

p = Process(target=f, args=('bob',)) 
p.start() 
p.join() 
+0

@MathBio J'ai dupe fermé l'autre avec ça. La réponse sur ce post est par le dev de Python IDLE et est donc beaucoup plus supérieure. –

Répondre

5

Oui. Les travaux suivants dans cette fonction f sont exécutés dans un processus séparé (troisième).

from multiprocessing import Process 

def f(name): 
    print('hello', name) 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

Cependant, pour voir la sortie print, au moins sous Windows, il faut commencer IDLE partir d'une console comme ceci.

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

J'ai déjà pensé à ajouter 'Run in Console' au menu Run IDLE. Les cas d'utilisation précédents que j'avais pour cela, en utilisant Windows getch et la sortie d'impression de colorisation, sont plutôt ésotériques. Voir la sortie d'impression de multiprocédés est beaucoup moins, et est nécessaire pour le débogage du code multi-traitement avec 'print'statements. Donc, je renforce la priorité de cette addition. –