Как перехватить стандартный вывод / стандартный поток ошибок при использовании многопроцессорной обработки. Процесс - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь эмулировать цели методов 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), но я думаю, что это слишком глупо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...