#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. барни, спасибо за объяснение. ценю помощь.