J'ai une application C++ avec certains éléments dans une file d'attente, ces éléments vont ensuite être traités par un script python. Je le veux pour qu'au maximum 10 instances du script python soient en cours d'exécution. Je prévois d'utiliser execl() pour lancer le processus python. Y a-t-il un moyen de dire que le processus s'est arrêté sans avoir à renvoyer un message au processus parent?indiquant quand un processus execl() se termine
Répondre
execl
ne lance pas de processus - il superpose le processus existant à un autre exécutable. fork
-t lancer un processus - et renvoie l'identifiant du processus enfant (aka pid
) au processus parent (retourne 0 pour le processus de l'enfant, voilà comment l'enfant sait qu'il est l'enfant pour qu'il puisse nettoyer les choses et exec
). Utilisez les pid
s des enfants pour vérifier s'ils sont terminés ou non, ou attrapez SIGCHLD pour garder une trace de cela.
Je recommande le SIGCHLD
donc vous n'avez pas « sondage » pour voir si un processus a pris fin, mais cette dernière approche est pas trop difficile non - exécuter une seule fois dans un certain temps:
def whosdone(pids):
nope = []
done = []
for pid in pids:
try: os.kill(pid, 0)
except OSError: nope.append(pid)
else: done.append(pid)
return done, nope
Par exemple, vous pouvez appeler régulièrement le done, pidslist = whosdone(pidslist)
et faire tout ce que vous devez faire à propos des PID qui sont faits. Bien sûr, quand vous fork
, utilisez l'idiome:
pid = os.fork()
if pid: # we're the parent process
pidslist.append(pid)
else: # we're the child process
# clean things up, etc, then exec
Si vous faites cela en C++ sous unix/linux, consultez wait(), waitpid(), waitid(), wait3(), or wait4(). Vous pouvez invoquer waitpid() NOHANG (interrogation) ou le bloquer jusqu'à la fin d'un processus enfant. Pid (process-id) est la valeur retournée par fork().
I did a painful "hard way" example of fork() earlier (using dup2() to re-route IO).
- 1. Comment détecter quand l'application se termine?
- 2. Démarrer le processus asynchrone et attendre qu'il se termine
- 3. Comment déterminer quand la copie se termine dans VBScript?
- 4. ostringstream et se termine
- 5. urlsafe_b64encode se termine toujours par '='?:
- 6. Python dire quand un transfert ftp se termine à la fin
- 7. Comment empêcher le processus de se fermer quand un pthread existe?
- 8. Debugginng un démon qui se termine de façon inattendue
- 9. Comment déclencher un rappel lorsqu'un NSAnimationContext se termine?
- 10. Quand est-ce que windows signale un handle de processus?
- 11. La macro EnvironmentEvent ne se termine pas
- 12. Comment être informé lorsqu'un processus se termine sous Windows et Linux?
- 13. Le processus Windows exécuté à partir de Java ne se termine pas
- 14. Sortie NSThread lorsque l'application se termine
- 15. en utilisant spawnl et en attendant que le processus fils se termine
- 16. Pourquoi le sous-processus.Popen n'attend pas jusqu'à ce que le processus fils se termine?
- 17. Le script PHP se termine prématurément
- 18. comment puis-je exécuter du code quand une application se termine avec asp.net mvc
- 19. Ajax timeout mais le côté serveur ne se termine pas
- 20. Comment puis-je utiliser Perl pour démarrer un processus distant et ne pas attendre qu'il se termine?
- 21. La session de débogage se termine prématurément avec vs.net 2008IE8
- 22. Comment exécuter un autre script en Python sans attendre qu'il se termine?
- 23. Le script PHP ne se termine pas lorsqu'il est terminé
- 24. voir la pile quand un accident se produit
- 25. Pourquoi une exception non gérée ne termine-t-elle pas un processus pendant le débogage?
- 26. Appel d'une méthode lorsque le thread se termine
- 27. Exécuter une instruction après que le thread se termine
- 28. Que se passe-t-il lorsqu'un JSP termine l'exécution?
- 29. SharePoint Workflow se termine prématurément lorsque l'événement onWorkflowItemChanged est atteint
- 30. Le filtre de réécriture Isapi se termine par une boucle
Seriez-vous en mesure d'étendre sur la façon de vérifier les années pid des enfants pour vérifier si leur fini? Je ne comprends pas comment cela me dirait si leur – whatWhat
os.kill (pid, 0) a déclenché une exception OSError si le processus pid est terminé (ou appartient à un autre utilisateur), pas d'exception si pid est en cours d'exécution pour le utilisateur actuel - aucun autre effet. Là, laissez-moi éditer ma réponse ... –
Ne serait-il pas préférable d'utiliser os.wait (0, os.WNOHANG)? Cela va récolter le processus de l'enfant, en supprimant une fuite de ressources, et éviter d'avoir à parcourir tous les enfants. – bdonlan