Я пытаюсь эмулировать цели методов subprocess.Popen stdout / stderr
для Python, то есть хочу создать N параллельных заданий с уникальными обработчиками stdout / stderr.
Это мой текущий код:
#!/bin/python
import time
import multiprocessing as mp
class Job(object):
def __init__(self, target, *a, **kw):
self.target = target
self.args = a
self.kwargs = kw
def parallelize(jobs):
"""
Args:
jobs (list): list of the jobs to run. with all its params
"""
procs = [mp.Process(target=job.target, args=job.args, kwargs=job.kwargs) for job in jobs]
for p in procs:
p.start()
for p in procs:
p.join()
def dummy(*a, **kw):
print a
time.sleep(1)
print kw
def main():
parallelize([Job(dummy) for i in range(2)])
main()
, который только распараллеливает задания. Выход по-прежнему отображается на экране. Если бы я использовал subprocess.Popen()
, я мог бы добавить stdout=PIPE()
аргумент для каждого процесса создания и сохранить его значение в объекте, который позже будет возвращен из parallelize()
, но я не понимаю, как.
многопроцессорная обработка предоставляет некоторые параметры, такие как использование conn
, но это не помогает, потому что я использую методы черного ящика, и я не могу переопределить их и заставить их отправлять на печать conn
вместо печати.
Эта страница предлагает захватить стандартный вывод, но я думаю, что это не очень хорошо, потому что параллельные процессы будут выводиться в одно и то же место без возможности разделения ...
Как мне достичь параллельных процессов (с целями методов Python) с помощью управления вводом-выводом?
Я думаю, что-то вроде subprocess.Popen('python -c "import my_module; my_module.my_method()", stdout=subprocess.PIPE)
, но я думаю, что это слишком глупо.