2011-07-13 17 views
4

簡單的例子,我有一個簡單的例子:與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() 

我想從字典中的子進程元素,則子進程退出刪除。怎麼做 ?

回答

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

注意兩件事情:

  • 不能調用reactor.run()通過這些循環來實現。你只能調用reactor.run()一次。幸運的是,所有這些都是需要的,因爲一旦運行它就可以處理任意數量的進程。
  • transport.pid在調用時間processExited時不再有效,所以如果您在進程退出後需要使用它,則需要提前保存。這是connectionMade方法中發生的情況。
  • 從子流程字典中刪除東西與刪除任何字典中的任何東西是一樣的。
相關問題