【发布时间】:2021-11-12 03:24:08
【问题描述】:
import multiprocessing
import time
def WORK(x,q,it):
for i in range(it):
t = x + '---'+str(i)
q.put(t)
def cons(q,cp):
while not q.empty():
cp.append(q.get())
return q.put(cp)
if __name__ == '__main__':
cp = []
it = 600 #iteratons
start = time.perf_counter()
q = multiprocessing.Queue()
p1 = multiprocessing.Process(target = WORK, args = ('n',q,it))
p2 = multiprocessing.Process(target=WORK, args=('x',q,it))
p3 = multiprocessing.Process(target=cons, args=(q,cp,))
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print(q.get())
end = time.perf_counter()
print(end - start)
我在 Pycharm 和 Colab 中运行此代码时遇到问题,如果我在 colab 中运行此代码,它只能在 1000 次迭代中正常工作,而在 WORK() 过程中则更少,如果更多 - 它会冻结。 在 Pycharm 中,只有 500 次或更少的迭代才能正常工作 有什么问题???有什么限制吗?
所以我发现不是很好的解决方案是从队列中删除 join 或将其放在 dict 调用之后,这有助于获得 mor 限制,使用此代码它开始在 pycharm 中进行 1000 次迭代,但 10000 次迭代再次陷入僵局
p1.join()
p2.join()
print(q.get())
p3.join()
end = time.perf_counter()
print(end - start)
进一步的变化帮助我通过添加 queuq maxsize 将迭代限制增加到 10000:
q = multiprocessing.Queue(maxsize = 1000)
那么这个队列有什么限制和规律??? 如何管理无休止的队列,例如从 websockets 开始,他们不断地发送数据
【问题讨论】:
-
阅读
multiprocessing.Queue上的文档!您不能尝试join一个正在写入队列的进程在您已从该队列读取所有记录之前。 -
喜欢吗?热帮助(( print(q.get()) p1.join() p2.join() p3.join() end = time.perf_counter() print(end - start)
标签: python multiprocessing queue