繁体   English   中英

为什么带有队列的多处理挂起?

[英]Why is multiprocessing with Queue hanging?

我正在尝试在本指南的帮助下探索multiprocessing模块的使用。

它建议运行此代码:

import multiprocessing as mp

def addPositive(queue):
    print("I am in addPositive.")
    for i in range(1, 100):
        queue.put(i)

def addNegative(queue):
    print("I am in addNegative.")
    for i in range(-100, 0):
        queue.put(i)

myQueue = mp.Queue()
process1 = mp.Process(target=addPositive, args=(myQueue,))
process2 = mp.Process(target=addNegative, args=(myQueue,))
process1.start()
process2.start()
process1.join()
process2.join()
while myQueue:
    print(myQueue.get(), end=",")
myQueue.close()

运行此代码我得到一个Runtime错误,我认为这是由于缺少if __name__ == "__main__":块引起的。 我已将代码更新为:

import multiprocessing as mp


def addPositive(queue):
    print("I am in addPositive.")
    for i in range(1, 100):
        queue.put(i)


def addNegative(queue):
    print("I am in addNegative.")
    for i in range(-100, 0):
        queue.put(i)


def run():
    myQueue = mp.Queue()
    process1 = mp.Process(target=addPositive, args=(myQueue,))
    process2 = mp.Process(target=addNegative, args=(myQueue,))
    process1.start()
    process2.start()
    process1.join()
    process2.join()
    while myQueue:
        print(myQueue.get(), end=",")
    myQueue.close()

 
if __name__ == "__main__":
    run()

当我运行它时,我从两个函数中获得了两个print语句,但随后执行挂起并且什么也不做。

我期待的 output 应该看起来像:

1,2,3,4,5,6,7,8,9,10,-1001,11,12,13,-1000,-999,-998,-997,-996,-995,-994,-993,-992,-991,-990,-989,-988,-987,-986,-985,-984,-983,-982,-981,14,-980,15,-979,16,17,18,19,20,21,22,23,24,25,26,-978,-977,-976,-975,-974,-973,-972,-971,-970...

有人可以帮忙解决问题吗?

  • Python:3.9.6
  • 操作系统:macOS 蒙特雷 12.4

由于您的队列存在, while myQueue:将永远运行并且永远不会退出。

正如 quamrana 建议的那样,通常在 while 循环中使用myQueue.qsize()应该可以解决问题。 但正如文档所述,这在 macOS 上不存在。 所以尝试while not myQueue.empty():代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM