2011-07-13 4 views
4

J'ai un exemple simple:exemple simple avec spawnProcess

subprocesses = {} 

class MyPP(protocol.ProcessProtocol): 
    def processExited(self, reason): 
     print "processExited, status %s" % (reason.value.exitCode,) 


class Test: 

    def run(self): 
     for i in range(0, max_processes): 
      pp = MyPP() 
      command = ['sleep','10'] 
      subprocess = reactor.spawnProcess(pp, command[0], command, {}) 
      subprocesses[subprocess.pid] = subprocess 
      reactor.run() 

Test().run() 

Je veux supprimer de l'élément sous-processus dictionnaire alors sous-processus est terminé. Comment faire ?

Répondre

9
subprocesses = {} 
max_processes = 3 

from twisted.internet import protocol, reactor 

class MyPP(protocol.ProcessProtocol): 
    def connectionMade(self): 
     self.pid = self.transport.pid 

    def processExited(self, reason): 
     print "processExited, status %s" % (reason.value.exitCode,) 
     del subprocesses[self.pid] 
     print 'Remaining subprocesses', subprocesses 


class Test: 
    def run(self): 
     for i in range(0, max_processes): 
      pp = MyPP() 
      command = ['sleep','3'] 
      subprocess = reactor.spawnProcess(pp, command[0], command, {}) 
      subprocesses[subprocess.pid] = subprocess 

Test().run() 
reactor.run() 

Avis d'un couple de choses:

  • Vous ne pouvez pas appeler reactor.run() pour chaque itération dans la boucle. Vous pouvez seulement appeler reactor.run() une fois. Heureusement, c'est tout ce qui est nécessaire, car une fois qu'il est en cours d'exécution, il peut gérer n'importe quel nombre de processus.
  • Le transport.pid n'est plus valide au moment où processExited est appelée, donc si vous devez l'utiliser après la fermeture du processus, vous devez l'enregistrer plus tôt. C'est ce qui se passe dans la méthode connectionMade.
  • La suppression d'éléments du dictionnaire de sous-processus est identique à la suppression de n'importe quel dictionnaire.