J'ai un simple problème à résoudre (plus ou moins) Il doit imprimer un 0 mais rien n'est imprimé. Au lieu de cela, il se bloque pour toujours au Si je démarre manuellement la fonction que vous effectuez cette p> Il imprime en fait 0 sur la coquille mais cela ne fonctionne pas simultanément de devrait être de mais est en fait de et si j'ajoute avant la dernière ligne p> alors la sortie devient Cela me semble déroutant ... p> et si j'essaie de rejoindre le processus, il attend pour toujours. P> Cependant, si cela peut m'aider à me donner une réponse - Mise à jour-- - Mise à jour 2-- comme cible du processus, puis que j'essaie de rejoindre Le processus, oisif attend pour toujours p> p>
Si je regarde les tutoriels multiprocessionnaires Python, je vois qu'un processus devrait être démarré plus ou moins comme ceci: a.join () code>. P>
Par exemple, la sortie du code suivant: p>
0
1 p>
0 p>
1
0 p>
Mon système d'exploitation est Mac OS X 10.6.8
Les versions Python utilisées sont 3,1 et 3.3
Mon ordinateur a 1 processeur Intel Core I3 P>
J'ai remarqué que ce comportement étrange n'est présent que lors du lancement du programme de veille, si je exécutez le programme du terminal Tout fonctionne comme censé, ce problème doit donc être connecté à un bogue de ralenti.
Mais les programmes de runnung du terminal sont encore plus étroits: l'utilisation de quelque chose comme la plage (100000000) active tous les RAM de mon ordinateur jusqu'à la fin du programme; Si je me souviens bien cela ne devrait pas arriver à Python 3, seulement dans les versions plus anciennes de Python.
J'espère que ces nouvelles informations vous aideront à donner une réponse p>
Le bogue se produit même si je n'effectue pas de sortie de mon processus, car définissez ceci: p>
4 Réponses :
Avez-vous essayé d'ajouter a.join () code> à votre programme? Je suppose que votre processus principal est en train de sortir avant les impressions de processus d'enfant qui provoquent la sortie de la sortie. Si vous dites au processus principal d'attendre le processus d'enfant (
a.join () code>), je parie que vous verrez la sortie que vous attendez. P>
non, si j'essaye A.Join () Python Interprète attendeur éternellement, et le processus enfant ne fonctionne pas comme je l'ai dit dans la question
Désolé, j'ai lu le code et je n'ai pas réalisé que c'est ce que vous vouliez dire dans le titre. J'ai édité la question elle-même pour inclure l'appel à A.Join. Je vais réfléchir à cela un peu plus.
Étant donné que cela ne se produit que avec oisif, je soupçonne que le problème a à voir avec le stdout utilisé par les deux processus. C'est peut-être un objet ressemblant à un fichier qui n'est pas sûr à utiliser à partir de deux processus différents. P>
Si vous n'avez pas le processus d'enfant écrivant sur stdout, je soupçonne qu'il remplira et joindre correctement. Par exemple, vous pourriez avoir d'écrire dans un fichier, à la place. Ou vous pouvez mettre en place un tuyau entre le parent et l'enfant. P>
Même si je donne à mon enfant traiter une tâche comme faisant de l'arithmétique, sans utiliser d'entrée ou de sortie, ni d'écrire dans un fichier, le TaskManager me dit qu'un seul noyau de mon processeur est utilisé.
Ce n'est pas un test sensible. À moins que ce noyau ne soit utilisé à 100% ou près de 100%, il n'y a aucune raison d'utiliser un autre noyau simplement parce qu'il existe un autre processus. La question est la suivante: le processus enfant est-il terminé avec succès et que la demande de jointure du parent réussit-elle?
Comme suggéré ici et ICI , le problème est que IDLE remplace Le premier lien indique également qu'il est peu probable qu'il soit corrigé à tout moment ("peut être un" ne peut pas réparer "problème", disent-ils). P>
Donc, malheureusement, la seule solution que je peux suggérer est de ne pas utiliser oisif pour ce script ... p> sys.stdin code> et
et
SYS.STDOUT CODE> de certaines façons étranges, qui ne se propagent pas proprement à des processus, vous appartenez à partir de celui-ci (ce ne sont pas des fichiers de fichiers réels). P>
Avez-vous essayé une sortie non volée? Essayez d'importer le module SYS et de modifier l'instruction Imprimer:
print >> sys.stderr, m
Je ne peux pas vous dire pourquoi, c'est pourquoi je n'ai pas posté cela comme une réponse, mais tous les exemples de processus de création n'ont aucune déclaration code> de retour code> dans la cible (qui est différente de
Piscine code> cibles). Avez-vous essayé de supprimer la déclaration de retour de
u code>?
@ SR2222 NOPE.
retour code> est équivalent à
renvoyer aucun code>. Flux de contrôle de modulo (pas une préoccupation dans l'exemple de OP), sans avoir un
retour code> est identique au retour
Aucun code>.
Vos exemples me donnent les résultats escomptés sur Linux sur toutes les versions Python que j'ai installées.
@delnan, ouais, je sais que pour des cas normaux, mais je n'étais pas sûr de si le bas dans les entrailles de l'extension C - _MultiproCess code>,
Sélectionnez code> ou
ou
FCNTL CODE> Bibliothèques, il y a une différence subtile et elle était exposée ici.
Pensez-vous qu'une prime pourrait m'aider à trouver une réponse?
Ne vivez-vous que le virus de l'interpréteur Python (je ne pouvais-je pas dire exactement de votre question)?