Я знаю об ограничениях Twisted для многопроцессорных приложений, но мой вопрос в другом. Я не пытаюсь запустить сервер или клиент, используя несколько процессов. У меня уже есть запущенное приложение, которое берет несколько каталогов и выполняет над ними некоторые операции. Я хочу разделить работу на куски, порождая процесс с одним и тем же приложением для каждого подкаталога. Я могу сделать это, запуская приложение несколько раз из оболочки и каждый раз передавая в качестве аргумента другой подкаталог.
В основном у меня есть что-то вроде:
from multiprocessing import Pool
...
p = Pool(num_procs)
work_chunks = [work_chunk] * len(configs)
p.map(run_work_chunk, zip(work_chunks, configs))
p.close()
p.join()
где:
def run_work_chunk((work_chunk, config)):
from twisted.internet import reactor
d = work_chunk.configure(config)
d.addCallback(lambda _: work_chunk.run())
d.addErrback(handleLog)
print "pid=", getpid(), "reactor=", id(reactor)
reactor.run()
return
class WorkChunk(object):
...
def run(self):
# do stuff
...
reactor.stop()
Допустим, num_procs
равно 2, тогда вывод будет примерно таким:
pid=2 реактор=140612692700304
pid=6 реактор=140612692700304
И вы не можете видеть никаких результатов для рабочих, работающих в других фрагментах.
Проблема в том, что когда вызывается reactor.stop()
, он останавливает все реакторы, потому что каждый процесс использует один и тот же реактор. Я думал, что при порождении нового процесса копируется весь стек, но в данном случае копируется ссылка на реактор, поэтому все процессы используют один и тот же объект реактора.
Есть ли способ создать экземпляр другого объекта реактора для каждого процесса? (как будто это действительно был совсем другой процесс, а не дочерний процесс)