Python многопроцессорный Труба с крупным объектом будет зависать - PullRequest
0 голосов
/ 01 июля 2018

Ниже приведен простой фрагмент кода, демонстрирующий проблему.

from multiprocessing import Pipe
import time

recv_end, send_end = Pipe(duplex=False)
d = {'word'+str(elem): elem for elem in range(3000)}

start_time = time.time()
send_end.send(d)
print('--- %s seconds ---' % (time.time()-start_time))

Вышеописанное работает нормально и достаточно быстро для моих целей, никаких проблем нет. Но если я сделаю размер до 5000, он просто висит бесконечно:

from multiprocessing import Pipe
import time

recv_end, send_end = Pipe(duplex=False)
d = {'word'+str(elem): elem for elem in range(5000)}  # changed to 5000

start_time = time.time()
send_end.send(d)
print('--- %s seconds ---' % (time.time()-start_time))

Есть ли ограничение на размер трубы или это невоспроизводимая проблема? Как насчет того, чтобы сделать размер еще больше? И если есть ограничение по размеру, каков наилучший способ избежать этой проблемы и отправить через большой словарь через Pipe? Заранее спасибо!

1 Ответ

0 голосов
/ 01 июля 2018

Эта проблема возникает из-за того, что Pipe.send() является блокирующим вызовом и ожидает получения. Подробнее здесь . Чтобы заставить его работать, вы можете создать процесс как в следующем коде:

#!/usr/bin/env python
from multiprocessing import Pipe, Process
import time
import sys


def foo(conn):
    d = {'word'+str(elem): elem for elem in range(5000)}  # changed to 5000
    conn.send(d)
    conn.close()


recv_end, send_end = Pipe(duplex=False)
p = Process(target=foo, args=(send_end, ))
p.start()

start_time = time.time()
recv_end.recv()  # Try to comment and you will see that it waits for being received
p.join()
print('--- %s seconds ---' % (time.time()-start_time))
...