spawnProcess的简单示例

时间:2011-07-13 12:22:26

标签: python twisted

我有一个简单的例子:

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

我想从字典subprocesses元素中删除然后退出子进程。怎么做?

1 个答案:

答案 0 :(得分: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方法中发生的情况。
  • 从子流程词典中删除内容与从任何词典中删除任何内容相同。
相关问题