Python multitraitement exemple ne fonctionne pas
Je suis en train d'apprendre comment utiliser multiprocessing
mais je ne peux pas le faire fonctionner. Voici le code à droite de la la documentation
from multiprocessing import Process
def f(name):
print 'hello', name
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()
il devrait sortie
"bonjour bob'
mais au lieu de cela je obtenir
>
pas d'erreurs ou d'autres messages, il est juste assis là, Il est en cours d'exécution dans IDLE
à partir d'un sauvés .py fichier sur une machine Windows 7 avec la version 32 bits de Python 2.7
Est votre instruction print vraiment pas prévu en vertu de la def?
Entendez-vous en retrait? Oui il est bien en retrait dans le code réel, que c'était une erreur que j'ai commise dans l'affichage
avez-vous d'enregistrer le code dans un fichier et de l'exécuter?
Oui je l'ai fait, est-ce que la matière?
Juste pour s'assurer que vous ne faites pas de la REPL chose.
Entendez-vous en retrait? Oui il est bien en retrait dans le code réel, que c'était une erreur que j'ai commise dans l'affichage
avez-vous d'enregistrer le code dans un fichier et de l'exécuter?
Oui je l'ai fait, est-ce que la matière?
Juste pour s'assurer que vous ne faites pas de la REPL chose.
OriginalL'auteur Devon Muraoka | 2014-01-18
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est que vous êtes à l'aide de veille pour essayer d'exécuter ce script. Malheureusement, cet exemple ne fonctionnera pas correctement dans le vide. Notez le commentaire au début de les docs:
La
__main__
module n'est pas importable par les enfants au RALENTI, même si vous exécutez le script dans un fichier avec l'arrêt (ce qui est généralement fait avec la touche F5).Fulminata, Où êtes-vous l'exécutez à partir de?
un
.py
fichier enregistré sur le disque durFulminata Et la façon dont vous exécutez ce fichier?
Fulminata, C'est précisément la question. Qui ne marche pas, depuis le
__main__
module n'est pas importable par les enfants au RALENTI, MÊME SI vous exécutez le script comme un .py fichier.OriginalL'auteur πόδας ὠκύς
Il fonctionne.
J'ai marqué les modifications nécessaires pour rendre votre échantillon exécuter à l'aide de commentaires:
résultat:
Sortie de mon ordinateur portable après l'enregistrer en tant que ex1.py:
Comme vous pouvez le voir, ce code ne fonctionne pas. Soit vous n'utilisez pas le même code que j'ai posté, ou le problème n'est pas le code. Où en êtes-vous de l'exécution du code? Comment utilisez-vous? Plus d'information est nécessaire.
Le problème est peut-être spécifique à Windows, je ne sais pas. Même sur Windows, si vous exécutez INACTIF depuis une ligne de commande, la sortie est visible. Voir ma réponse.
OriginalL'auteur Reut Sharabani
Le problème n'est pas INACTIF. Le problème est d'essayer d'imprimer à sys.stdout dans un processus qui n'a pas de sys.la sortie standard stdout. C'est pourquoi Spyder a le même problème. L'interface graphique du programme sur Windows est susceptible d'avoir le même problème.
Sur Windows, au moins, l'interface graphique, les programmes sont généralement exécuté dans un processus sans stdin, stdout ou stderr ruisseaux. Windows s'attend à ce programme avec une interface graphique pour interagir avec les utilisateurs grâce à des widgets que la peinture pixels sur l'écran (le G dans l'interface Graphique) et de recevoir les clés et les événements de souris à partir de Windows le système d'événements. C'est ce que l'INACTIVITÉ de l'interface graphique, à l'aide de la tkinter wrapper de la tcl tk GUI cadre.
Lors de l'INACTIVITÉ s'exécute le code de l'utilisateur dans un processus secondaire, idlelib.run exécute d'abord, et il remplace Aucun pour le flux standard avec des objets qui interagissent avec l'INACTIVITÉ de lui-même par l'intermédiaire d'un support. Puis il exec()s le code de l'utilisateur. Lorsque l'utilisateur s'exécute le code de multitraitement, multitraitement commence d'autres procédés qui n'ont aucune mst cours d'eau, mais jamais les obtenir.
La solution est de démarrer au RALENTI dans une console:
python -m idlelib.idle
(le.idle
n'est pas nécessaire sur 3.x). Processus a commencé dans une console obtenir std flux de la connexion à la console. Afin de procéder à d'autres sous-processus. Le réel stdout (par opposition à l'sys.stdout) de tous les processus est la console. Si l'on exécute le troisième exemple de la doc,puis la "ligne principale" en bloc passe à l'écran de la coquille et de la fonction f' bloc va à la console.
Ce résultat montre que Justin Barbier prétendent que l'utilisateur de l'exécution du fichier par INACTIFS ne peuvent pas être importés dans le processus a commencé par le multitraitement n'est pas correct.
EDIT: Python enregistre l'original de la sortie standard d'un processus dans
sys.__stdout__
. Voici le résultat dans le vide de la coquille lors de l'INACTIVITÉ est démarré normalement sur Windows, comme un pur GUI processus.Voici le résultat en cas d'INACTIVITÉ est démarré à partir de CommandPrompt.
La norme numéros de fichier pour stdin, stdout, et stderr sont 0, 1, 2. Exécuter un fichier avec
au RALENTI commencé dans la console et le résultat est le même.
OriginalL'auteur Terry Jan Reedy
Probablement votre principal processus s'arrête avant sysout est vidé. Essayez ceci:
Si cela ne fonctionne pas, essayez d'ajouter
time.sleep(1)
que la dernière instruction.Le code est correct, vous ne pouvez pas le voir à la sortie. Multitraitement comportement dépend de la machine que vous exécutez, et le vôtre est peut-être juste assez rapide pour avaler la sortie avant vous pouvez le voir.
Downvote tout ce que vous voulez mais s'il vous plaît laisser un commentaire afin que je puisse améliorer la réponse.
Le rinçage n'est pas la question quand il n'y a pas de sortie standard (stdout) pour rincer. Avoir un flux stdout résoudre le problème. Voir ma réponse.
OriginalL'auteur miraculixx
J'ai eu le problème de multitraitement ne fonctionne pas sur les Spyder, et toujours atterri ici. Je l'ai résolu en utilisant le filetage au lieu de multitraitement. comme décrit ici: https://pymotw.com/2/threading/
Sami, si vous pouvez commencer Spyder à partir d'une console de ligne de commande, la sortie doit être visible, car il est INACTIF. (Êtes-vous en cours d'exécution sur Windows ou ???.)
Terry, je ne l'ai pas essayé et oui, je suis en cours d'exécution sur Windows. Karl: je vous remercie, j'ai ajouté les exemples.
OriginalL'auteur Sami