当队列大小超过特定值(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,所有子进程都关闭了,但“主要完成”却从不显示,并且主要进程保持运行状态
答案 0 :(得分:0)
问题在于,没有任何东西正在消耗ALTER TABLE oc_booking ADD FOREIGN KEY (id_user) REFERENCES oc_user(`user_id`);
中的数据。工人能够完成他们的工作,因为队列在他们的一边被缓冲,但是(某些)进程保持活动状态,等待能够将数据刷新到底层管道。有关更多详细信息,请参见https://bugs.python.org/issue29797。
根据您的情况,管道似乎能够在其缓冲区中容纳1386个项目。