使用spawnProcess的简单示例

4 投票
1 回答
4735 浏览
提问于 2025-04-16 21:25

我有一个简单的例子:

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

我想在子进程退出后,从字典中删除子进程的元素。该怎么做呢?

1 个回答

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()。幸运的是,这样就足够了,因为一旦它开始运行,就可以处理任意数量的进程。
  • 当 processExited 被调用时,transport.pid 已经不再有效了,所以如果你需要在进程退出后使用它,你需要提前保存。这个过程在 connectionMade 方法中就发生了。
  • 从子进程字典中删除东西和从任何字典中删除东西是一样的。

撰写回答