2009-06-13 6 views
1

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

5

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 
+0

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

+0

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

+0

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

Questions connexes