spawnProcess的简单示例

bdf*_*dfy 4 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()
Run Code Online (Sandbox Code Playgroud)

我想从字典子进程中删除子进程,然后退出子进程.怎么做 ?

Jea*_*one 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()
Run Code Online (Sandbox Code Playgroud)

注意几件事:

  • 您不能通过循环为每次迭代调用reactor.run().你只能调用一次reactor.run().幸运的是,这就是所需要的,因为一旦运行它就可以处理任意数量的进程.
  • transport.pid不再受时间有效processExited被调用,所以如果你需要的过程出来后,你需要提前保存它使用它.这是该connectionMade方法中发生的情况.
  • 从子流程字典中删除内容与从任何字典中删除任何内容都是一样的.