python3 queue.put () блокирует основной - PullRequest
1 голос
/ 25 июня 2019

python3 queue.put () блокирует основной процесс, когда размер очереди превышает определенное значение (1386).

Я использую 30 подпроцессов и две очереди для подсчета целого числа, каждый подпроцесс получает номер из первой очереди, а затем помещает этот номер во вторую очередь. Я вижу, как все подпроцессы успешно закрываются, но основной процесс заблокирован. дело в том, что когда длина номера меньше 1387, она работает хорошо. Python версия 3.7.0

    #!/usr/bin/env python
from multiprocessing import Manager, Process, Lock, Queue


def work(q_in, o_out, process, lock):
    print("process ", process, "start")
    while 1:
        lock.acquire()
        if q_in.empty():
            lock.release()
            break
        d1 = q_in.get(timeout=1)
        o_out.put(d1*2)
        print("in process ", process, " queue 2 size", o_out.qsize())
        lock.release()
    print("process ", process, "done")


if __name__ == '__main__':
    length = 1386
    q_in = Queue(length)
    q_out = Queue(length)
    for i in range(length):
        q_in.put(i)
    lock = Lock()
    processes = list()
    for i in range(30):
        p = Process(target=work, args=(q_in, q_out, i, lock))
        processes.append(p)
        p.start()
    [p.join() for p in processes]
    print("main done")

если длина меньше 1386, я вижу "основное выполнено", но длина = 1387, все подпроцессы закрыты, но "основное выполнено" никогда не отображается, и основной процесс продолжает работать

1 Ответ

0 голосов
/ 25 июня 2019

Проблема в том, что ничто не потребляет данные из q_out.Рабочие могут завершить свою работу, потому что очередь буферизируется на их стороне, но (некоторые из них) процессы остаются живыми, ожидая возможности сброса данных в нижележащий канал.См. https://bugs.python.org/issue29797 для получения более подробной информации.

В вашем случае труба может содержать 1386 элементов в своем буфере.

...