使用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()
我想在子进程退出后,从字典中删除子进程的元素。该怎么做呢?
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
方法中就发生了。 - 从子进程字典中删除东西和从任何字典中删除东西是一样的。