Оценка данных, переданных через многопроцессорный канал

#python #multiprocessing #pipe

#python #многопроцессорная обработка #канал

Вопрос:

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

 import multiprocessing as mp

def child(conn):
    while True:
        if conn.recv()==1:
            conn.send(1)

        if conn.recv()==2:
            conn.send(2)

    conn.close()

def main():

    parent_conn, child_conn = mp.Pipe()
    p = mp.Process(target=child, args=(child_conn,))
    p.start()

    while True:
        parent_conn.send(1)
        print(parent_conn.recv())

    p.join()

if __name__ == '__main__':
    main()
  

Но если я присвою переменную conn.recv() в дочернем процессе, как показано ниже. Тогда все работает.

 def child(conn):
    while True:

        x = conn.recv()
        
        if x==1:
            conn.send(1)

        if x==2:
            conn.send(2)

    conn.close()
  

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

Я использую Python 3.7 в Windows 10.

Комментарии:

1. Ваш код «блокируется», потому что код в клиенте вызывает conn.recv() дважды каждый раз в цикле. Ваш пересмотренный код вызывает conn.recv() только один раз за цикл. Второй вызов conn.recv() не отвечает, потому что он получает 1, а не 2, поэтому родительский сервер перестает ждать ответа.

2. Кстати, код останавливается как в дочернем, так и в родительском: родительский ожидает ответа, который он никогда не получит, а дочерний ожидает, если conn.recv()==1 . Простая отладка путем добавления операторов печати после каждого дочернего recv и родительской отправки.

3. барни, спасибо за объяснение. ценю помощь.