2017-01-01 10 views
1

Я пытаюсь связать выполнение порожденного процесса в рабочем пуле с новым системным терминалом. В следующем примере (адаптированный из ответа @ sylvain-leroux на вопрос this) пул работников сконструирован для выполнения некоторой работы с объектами в очереди.Как я могу запустить каждого работника в многопроцессорном режиме. Пул в новой оболочке?

import os 
import time 
import multiprocessing 

# A main function, to be run by our workers. 
def worker_main(queue): 
    print('The worker at', os.getpid(), 'is initialized.') 
    while True: 

     # Block until something is in the queue. 
     item = queue.get(True) 
     print(item) 
     time.sleep(0.5) 

if __name__ == '__main__': 

    # Instantiate a Queue for communication. 
    the_queue = multiprocessing.Queue() 

    # Build a Pool of workers, each running worker_main. 
    the_pool = multiprocessing.Pool(3, worker_main, (the_queue,)) 

    # Iterate, sending data via the Queue. 
    for i in range(5): 
     the_queue.put("That's a nice string you got there.") 
     the_queue.put("It'd be a shame if something were to... garble it.") 

    worker_pool.close() 
    worker_pool.join() 
    time.sleep(10) 

Если запустить это из терминала системы вы увидите кучу искаженного текста, потому что каждый из рабочих пишет к, и выполняется в, ту же консоль. Для проекта, над которым я работаю, было бы полезно создать новую оболочку/консоль для размещения каждого рабочего процесса, чтобы весь напечатанный вывод отображался в этой оболочке, а выполнение рабочего процесса - это хост в этой оболочке. Я видел несколько примеров, делающих это с помощью Popen с использованием ключевого слова shell, но мне нужно придерживаться реализации на основе пула из-за ограничений совместимости. Кто-нибудь там сделал это? Приветствуется руководство.

+0

В Linux вы можете писать разделенные файлы и вручную открывать оболочки для использования команды 'watch -n 1 cat file.txt' для отображения нового содержимого файлов каждую секунду. – furas

+0

Спасибо @furas. Это полезная идиома, которую нужно знать. Я обычно работаю в Linux, но я хотел бы, чтобы это решение было кросс-платформенным, для расширяемости. Кроме того, хотя это даст мне доступ к печатной информации, это не приведет к тому, что выполнение будет привязано к наблюдающей оболочке, что желательно для моего приложения. –

ответ

1

Попробуйте использовать Queue наоборот.

Пусть рабочие put сообщения в Queue, и в родительском процессе get их от Queue и распечатать их. Это должно избавиться от смешанной продукции.

Если вы хотите передавать сообщения как от родителя к рабочим, так и обратно, используйте две очереди. Один для передачи сообщений рабочим, а другой - для передачи сообщений родителям.

+0

Это интересное использование Очереди, которое я не рассматривал - это, вероятно, пригодится. К сожалению, в этом случае это не будет сделано. Мне все еще нужно передать информацию, которую только родительский процесс имеет для рабочих через эту очередь, чтобы сделать полезную работу. В этом примере все работники печатаются, но на самом деле они будут делать что-то с информацией. Я пытаюсь разделить порожденные рабочие процессы с терминала, в котором был создан пул. Извращенный текст является симптомом связи, но не всей проблемой. Я изменил вопрос, чтобы быть более ясным. Благодаря! –

+0

@JustinFletcher Затем просто используйте два 'Queue's. См. Обновленный ответ. –