8
votes

Python - avoir la poignée de fil parent des filets enfants

Y a-t-il un moyen d'avoir le parent qui a engendré un nouveau thread attrape l'exception des threads engendrés? Vous trouverez ci-dessous un exemple de base de ce que j'essaie d'accomplir. Il devrait cesser de compter quand une exception est soulevée, mais je ne sais pas comment l'attraper. Les exceptions sont-elles le fil en sécurité? J'aimerais pouvoir utiliser le module sous-processus , mais je suis coincé à l'aide de Python 2.3 et je ne suis pas sûr de savoir comment faire cela. Éventuellement à l'aide du module threading ? XXX

MISE À JOUR

Mon code d'origine était un peu trompeur. Il cherche vraiment quelque chose de plus comme celui-ci: xxx

J'essaie de créer un chien de garde pour tuer l'appel OS.System si le programme raccroche une raison quelconque.


3 commentaires

Dupe possible de Stackoverflow.com/Questtions/2829329/...


Qu'essayez-vous d'atteindre, on dirait que vous souhaitez signaler un événement de fil d'enfant au fil parent? Ou voulez-vous vraiment passer des exceptions autour?


J'essaie de tuer un appel os.System si elle prend trop longtemps, probablement pas la bonne façon.


4 Réponses :


2
votes

coincé à l'aide de Python 2.3

Python 2.3 est comme 10 ans maintenant. Pourquoi l'utilisez-vous toujours?

éventuellement à l'aide du module de filetage

Vous devriez utiliser la filetage de toute façon.

Vous pensez probablement au problème de problème. Vous devriez probablement créer des classes et repenser l'approche de votre problème.

En outre, si vous créez un chien de garde, cela n'a probablement pas beaucoup de sens de l'avoir dans le même processus que ce que vous faites. Time.sleep () est un appel système qu'un python régulier exception n'annulera pas de toute façon.


1 commentaires

Je suis coincé en utilisant 2.3 car c'est ce que les modules PSS / E REV 30 Python sont compilés et c'est ce que nous utilisons.



2
votes

Si ce que vous essayez vraiment de faire est de passer / gérer une exception, je ne pense pas que vous souhaitiez utiliser une sous-processus, car le processus parent ne peut que "voir" le code d'état (et la sortie) produite par le Processus pour enfants - uniquement dans les cas d'échec immédiat et catastrophique dans le processus d'enfant, une exception est "re-levée" dans le parent: http://docs.python.org/library/subprocess.html#Exceptions .

et (encore une fois si vous essayez de passer / gérer une exception), je ne suis pas sûr de vouloir des fils, non plus. Après tout, tout le point (IMO) d'exceptions est d'avoir quelque chose qui peut être manipulé soit manipulé "par l'appelant" (à l'intérieur d'un bloc d'essai) ou peut fournir des informations de backtrace significatifs (la séquence d'appel) si pas manipulé. Aucune idée ne fonctionne vraiment avec "jeter" dans un fil et "attraper" dans un autre.

Si votre objectif réel est d'avoir un morceau de logique "Time Out" un autre, je pense que c'est logique que votre "WatchDog" soit un processus distinct - soit un "parent" qui surveille la production d'un "enfant "(ainsi que le temps écoulé), ou un" peer "qui" regarde "quelque chose comme des lignes de journalisation et / ou des mises à jour de DB par le processus surveillé (ainsi que l'horloge). Dans aucun cas, des exceptions sont particulièrement pertinentes. Et je recommande de jeter un coup d'œil à la réponse de Alex Martelli à cette question: Utilisation de Module 'Subprocess' avec Timeout < / p>

Cette question a également quelques bonnes réponses pertinentes pour votre question: attraper une exception de fil dans le fil de l'appelant à Python


4 commentaires

J'essaie de tuer un os.System si pour une raison quelconque, il raccroche. Donc, ce que j'essayais, c'était tuer le processus parent lorsque le chien de garde engendré revient avec une exception. Y a-t-il quelque chose d'autre autre que os.system ou OS.popen que je peux appeler qui continuera immédiatement à Python que je pourrais contenir dans un pendant Boucle jusqu'à ce que le délai ou l'achèvement?


Vous pensez toujours trop spécifiquement. Dites-nous ce que vous essayez d'accomplir. J'essaie de tuer un appel OS.System si pour une raison quelconque, il se bloque. Vous serez vraiment pressé pour trouver une solution réelle à cela. Votre problème est probablement que l'appel du système est suspendu, pas que vous ne pouvez pas l'interrompre.


Ou vous pouvez y penser de cette façon (ce qui n'est pas spécifique à Python, en passant) - s'il y a un appel système qui peut "suspendre" pour une raison quelconque qui est en dehors de votre contrôle, alors vous faites le parent Processus Soyez le "WatchDog" et avons le processus enfant être celui qui exécute en réalité l'appel du système. Le parent peut ensuite surveiller le processus d'enfant de différentes manières - l'enfant peut écrire des messages "cardieux" à STDOUT (disons toutes les 30 secondes) surveillés par le parent, par exemple, et le parent peut décider lorsque le processus d'enfant est "suspendu "Et tuez-le si nécessaire.


Falmarri - C'est simple, j'appelle un programme de non-Python (dans cet exemple Count_To_10.exe) et mon programme Python doit attendre que ce soit fait pour continuer. Envisagez maintenant au lieu de compter_to_10 C'était Count_To_Number et le nombre était l'infini. Je veux avoir un chien de garde qui semble voir si le programme non python prend trop de temps et l'arrêtez, puis soulevez une exception.



3
votes

Pourquoi pas quelque chose comme ça

def system_call():
    os.system('count_to_10.exe')

system_thread = thread.start_new_thread(system_call)
time.sleep(timeout)
system_thread.kill()


4 commentaires

Thread.Kill est ce que j'essaie d'accomplir, mais malheureusement, ce commandement n'existe pas.


Mais os.kill existe et fonctionne bien. Plusieurs des réponses à Stackoverflow.com/questions/337863/... démontrer comment organiser un parent exécuter un appel système avec délai d'attente, ce qui semble être vraiment ce que vous " en essayant d'atteindre.


Aussi fantastique qu'il serait d'utiliser le module sous-processus , je ne peux pas parce que, comme je l'ai dit dans l'article original, je suis bloqué en utilisant 2.3. J'essayais de trouver un travail autour de cela, mais on dirait que je suis capable de passer à Python 2.4 ou plus, je suis incapable de. Dès présent, les modules utilisés pour le programme que je travaille sont compilés en 2.3 et ne fonctionneront pas en 2.4+.


thread.kill () doit être à base de code à base nomée. Veuillez essayer le module de threading et utiliser des threads basés sur la classe. Vous pourriez accomplir beaucoup avec ça.



1
votes

Je sais que vous êtes coincé à l'aide de Python 2.3, mais si vous ne pouviez que faire l'avancement (très) modeste à Python 2.4, vous pourriez tirer parti de cette approche plus simple, copié d'une réponse donnée par Yaroslav Bulatov à une question (lecture recommandée) À propos de la commande d'une commande externe avec le délai d'attente: python, popen et sélectionner - en attente d'un processus de résiliation ou d'un délai d'attente xxx

Ceci est un exemple de processus parent chronométrant un processus d'enfant, Comme mentionné dans ma réponse antérieure.


0 commentaires