python многопроцессорность с динамической c очередью, которая заполняется - PullRequest
0 голосов
/ 10 июля 2020

У меня возникла проблема с настройкой очереди, которая пополняется на основе уже выполненных заданий. Я пытаюсь поместить несколько элементов в очередь, и по мере их выполнения они будут генерировать новые элементы в очереди.

Код в настоящее время настроен так, что процесс генератора настроен в основном . Он создает задания, пока очередь не опустеет. У меня есть канал связи, но он, кажется, просто работает в последовательном режиме. Я неправильно интерпретирую?

Причина, если вам интересно: я прохожу свой путь через сетку, где каждый процесс зависит от вывода из соседнего элемента. Таким образом, существует возможность многопроцессорной обработки, но элемент сетки не может работать до того, как это сделает его предыдущий сосед.

from multiprocessing import Queue, Process, Manager, Pool, Pipe
import random
import signal
import time


def a_subprocess(x,conn):
    delay = random.random()
    time.sleep(delay)
    #delayed here to emulate running another script. 
    conn.send(x)
    conn.close()

def process_maker(q):
    # Imitate CPU-bound work happening in writer
    while not q.empty():
        n = q.get()
        parent_conn, child_conn = Pipe()
        p = Process(target=a_subprocess,args=(n,child_conn))

        p.start()
        print(parent_conn.recv())   

if __name__ == '__main__':
    # Create manager
    m = Manager()
    
    # Create multiprocessing queue
    q = m.Queue()
    for i in range(23): 
        q.put(i)
    # Create a group of parallel writers and start them
    p = Process(target=process_maker, args=(q,))
    p.start()

    q.put(49)  #I can add things to the queue and it works

    p.join()

Вопросы:

  1. есть ли какие-нибудь примеры того типа установки, который я ищу? Мне кажется, что я дошел до конца google :)
  2. Действительно ли я получаю многопроцессорность из текущей настройки?
  3. Есть ли способ управлять количеством процессов в process_maker? Мне не удалось заставить пул работать в функции process_maker.

Кажется, должен быть лучший способ сделать это. Открыт для любых предложений и советов.

...