многопроцессорность: как отправить данные от родителя к постоянно работающему дочернему процессу?

Можно ли использовать многопроцессорность для отправки данных работающему дочернему процессу? Например, запуск веб-сервера в дочернем процессе и использование родительского процесса для отправки данных на сервер. Я нашел этот вопрос о полной противоположности моей ситуации (т. е. непрерывные обновления от работающего дочернего процесса обратно к родительскому). Есть ли способ заставить это работать? Насколько я понимаю, multiprocessing.Queue отправляет/получает данные только при завершении процесса. Этот псевдокод дает скелет того, что я хотел бы сделать:

def server(q):
    //start eventlet server
    q.get() // --> does something

q = Queue()
p = Process(target=server, args=(q,))
p.start()
q.put("some kind of command")

person rustbird    schedule 03.07.2020    source источник
comment
Здравствуйте, rustbird, не могли бы вы рассказать немного больше о контексте того, что вы пытаетесь сделать. Если у вас есть веб-сервер в качестве дочернего процесса, почему бы просто не общаться с ним через http. Рассматривали ли вы возможность использования очереди задач, такой как сельдерей? docs.celeryproject.org/en/stable/getting-started/   -  person Omar Nasr    schedule 03.07.2020


Ответы (2)


Я думаю, вы неправильно прочитали ответ, который вы цитировали. multiprocessing.Queue был разработан именно для той цели, которую вы описываете. Может быть, проверить справочную документацию для этого класса? Альтернативой также может быть multiprocessing.Pipe.

person Daniel Junglas    schedule 03.07.2020
comment
В моем коде команда q.get() никогда не достигается, потому что сервер событий все еще работает. Я не могу понять, как поддерживать работу сервера и передавать ему данные с помощью очередей. - person rustbird; 03.07.2020

Ваш псевдокод работает почти так, как написано:

from multiprocessing import Queue, Process
import time

def server(q):
    while True:
        stuff = q.get()
        print(stuff, flush=True)

if __name__ == '__main__':
    q = Queue()
    p = Process(target=server, args=(q,))
    p.start()
    for i in range(5):
        q.put(i)
        time.sleep(1)
    p.terminate()
person Mike Organek    schedule 03.07.2020