viksnamax
@viksnamax
Aliens is here!

Как реализовать двунаправленный обмен сообщениями между процессами?

Как реализовать двунаправленный обмен сообщениями между родительским и дочерним процессом в библиотеке multiprocessing на python?
В документации написано, что duplex должен быть равен True для двунаправленного обмена, а кода как это должно выглядеть нету. Предполагаю, что необходимо в функцию foo добавить обработчик сообщений как в конце кода, вот только у меня как-то криво работает, код не завершает работу.

Код однонаправленного обмена:
import time, random
from multiprocessing import Process, Pipe, current_process
from multiprocessing.connection import wait

def foo(w):
    for i in range(10):
        w.send((i, current_process().name))
    w.close()

if __name__ == '__main__':
    readers = []

    for i in range(4):
        r, w = Pipe(duplex=False)
        readers.append(r)
        p = Process(target=foo, args=(w,))
        p.start()
        w.close()

    while readers:
        for r in wait(readers):
            try:
                msg = r.recv()
            except EOFError:
                readers.remove(r)
            else:
                print(msg)

Код моей реализации двунаправленного обмена
import time, random
from multiprocessing import Process, Pipe, current_process
from multiprocessing.connection import wait

def foo(w, i):
    readers2 = []
    readers2.append(w)
    w.send((i, "Child"))
    while readers2:
        for r2 in wait(readers2):
            try:
                msg = r2.recv()
            except EOFError:
                readers2.remove(r2)
            else:
                print("Child: " + msg)
    w.close()


if __name__ == '__main__':
    readers = []

    for i in range(1):
        r, w = Pipe(duplex=True)
        readers.append(r)
        p = Process(target=foo, args=(w,i))
        p.start()

        w.close()

    while readers:
        for r in wait(readers):
            try:
                msg = r.recv()
                r.send("test_1")
                r.send("test_2")
            except EOFError:
                readers.remove(r)
            else:
                print(msg)
    r.close()
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 1
@javedimka
Хочу сока
Просто сделай две очереди. Зачем всё усложнять.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы