простой пример с spawnProcess - PullRequest
4 голосов
/ 13 июля 2011

У меня есть простой пример:

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 голосов
/ 13 июля 2011
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 () для каждой итерации цикла.Вы можете вызывать реактор.run () только один раз.К счастью, это все, что нужно, потому что после запуска он может обрабатывать любое количество процессов.
  • transport.pid больше не действует к моменту вызова processExited, так что если вам нужно использовать его послепроцесс завершается, вам нужно сохранить его раньше.Это то, что происходит в методе connectionMade.
  • Удаление элементов из словаря подпроцесса аналогично удалению чего-либо из любого словаря.
...