python3 queue.put()阻塞了main

时间:2019-06-25 09:55:53

标签: python multiprocessing queue

当队列大小超过特定值(1386)时,python3 queue.put()将阻塞主进程。

我使用30个子流程和两个队列来计算一个int数,每个子流程从第一个队列中获取数字,然后将该数字放入第二个队列中。我可以看到所有子进程成功关闭,但是主进程被阻塞了。商品是,当数字长度小于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 :(得分:0)

问题在于,没有任何东西正在消耗ALTER TABLE oc_booking ADD FOREIGN KEY (id_user) REFERENCES oc_user(`user_id`); 中的数据。工人能够完成他们的工作,因为队列在他们的一边被缓冲,但是(某些)进程保持活动状态,等待能够将数据刷新到底层管道。有关更多详细信息,请参见https://bugs.python.org/issue29797

根据您的情况,管道似乎能够在其缓冲区中容纳1386个项目。