2017-01-11 8 views
0

Глядя на создание скрипта python, который запускает бесконечный цикл чтения из stdin, как for line in sys.stdin:. Для каждой итерации я хотел бы получить работника из пула, который выполняется в фоновом режиме, используя line в качестве входных данных. Процесс завершения выполнения или тайм-аута отпечатков на stdout.Непрерывное параллельное выполнение Python

Мне сложно найти модуль рабочего пула, который может работать непрерывно. Например, multiprocess pool module поддерживает только такие функции, как join, которые ждут, когда все работники закончат все задания. Для вышеприведенной спецификации я не могу заранее знать все задачи и назначать работу, как это происходит с процессами в фоновом режиме.

+0

Вы можете использовать отдельный процесс, который потребляет из очереди результатов от рабочие (процесс также), печатающий его на стандартный вывод. – bhdnx

+0

Воспроизведение идеи ... Каждая строка добавляется в очередь. Затем каждый процесс непрерывно проверяет очередь для строки. (Нужно ли блокировать очередь, чтобы несколько процессов не удаляли одну и ту же строку из очереди?). Тогда, если есть строка, процесс удалит ее из очереди и напечатает результат в stdout, после чего он вернется к просмотру очереди? Как заставить процесс отключиться, если работа занимает слишком много времени и для продолжения? Вы знаете какие-либо примеры в Интернете? –

+0

У вас есть процесс создания нереста mainloop (..., args = (очередь, строка)) по мере поступления каждой новой строки. Между тем, ранее обработанный процесс обрабатывает очередь и печатает результаты. https://docs.python.org/3.6/library/multiprocessing.html – bhdnx

ответ

1

Это будет работать вечно.

import sys 
from multiprocessing import Pool 

pool = Pool() 

for line in sys.stdin.readline(): 
    pool.apply_async(function, args=[line]) 

def function(line): 
    """Process the line in a separate process.""" 
    print(line) 
+0

Эй! Я уверен, что это не сработает. Ты это пробовал? Я пробовал что-то вроде этого с циклом от 1 до 10. Приложение apply_async фактически не запускает задачу. –

+0

Вы можете увидеть его здесь, в действии: http://pastebin.com/19mSxGha – noxdafox

0

Использование Pool и imap может сделать его проще, но вы должны взять на себя максимальную мощность рабочих (processes=5):

import multiprocessing 
import sys 


def worker(line): 
    return "Worker got %r" % (line) 


pool = multiprocessing.Pool(processes=5) 
for result in pool.imap(worker, sys.stdin): 
    print "Result: %r" % (result) 
Смежные вопросы