8
votes

Pourquoi processus ne joint pas et ne fonctionne pas?

J'ai un simple problème à résoudre (plus ou moins)
Si je regarde les tutoriels multiprocessionnaires Python, je vois qu'un processus devrait être démarré plus ou moins comme ceci: xxx

Il doit imprimer un 0 mais rien n'est imprimé. Au lieu de cela, il se bloque pour toujours au a.join () .

Si je démarre manuellement la fonction que vous effectuez cette xxx

Il imprime en fait 0 sur la coquille mais cela ne fonctionne pas simultanément de
Par exemple, la sortie du code suivant: xxx

devrait être de
0
1

mais est en fait de
0

et si j'ajoute avant la dernière ligne xxx

alors la sortie devient
1
0

Cela me semble déroutant ...

et si j'essaie de rejoindre le processus, il attend pour toujours.

Cependant, si cela peut m'aider à me donner une réponse
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

- Mise à jour--
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

- Mise à jour 2--
Le bogue se produit même si je n'effectue pas de sortie de mon processus, car définissez ceci: xxx

comme cible du processus, puis que j'essaie de rejoindre Le processus, oisif attend pour toujours


6 commentaires

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 de retour dans la cible (qui est différente de Piscine cibles). Avez-vous essayé de supprimer la déclaration de retour de u ?


@ SR2222 NOPE. retour est équivalent à renvoyer aucun . Flux de contrôle de modulo (pas une préoccupation dans l'exemple de OP), sans avoir un retour est identique au retour Aucun .


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 , Sélectionnez ou ou FCNTL 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)?


4 Réponses :


0
votes

Avez-vous essayé d'ajouter a.join () à 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 () ), je parie que vous verrez la sortie que vous attendez.


2 commentaires

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.



0
votes

É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.

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.


2 commentaires

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?



6
votes

Comme suggéré ici et ICI , le problème est que IDLE remplace sys.stdin et et SYS.STDOUT 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).

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).

Donc, malheureusement, la seule solution que je peux suggérer est de ne pas utiliser oisif pour ce script ...


0 commentaires

0
votes

Avez-vous essayé une sortie non volée? Essayez d'importer le module SYS et de modifier l'instruction Imprimer:

print >> sys.stderr, m


0 commentaires