gpt4 book ai didi

python - 多进程消息队列未接收消息

转载 作者:行者123 更新时间:2023-11-30 22:18:44 25 4
gpt4 key购买 nike

我有一个脚本,它创建一个类并尝试在单独的进程中启动该类的对象;

class Task():
def __init__(self, messageQueue):
self.messageQueue = messageQueue

def run(self):
startTime = time.time()
while time.time() -startTime < 60:
try:
message = self.messageQueue.get_nowait()
print message
self.messageQueue.task_done()
except Queue.Empty:
print "No messages"
time.sleep(1)

def test(messageQueue):
task = Task(messageQueue)
task.run()

if __name__ == '__main__':
messageQueue = Queue.Queue()
p = Process(target=test, args=(messageQueue,))
p.start()
time.sleep(5)
messageQueue.put("hello")

我没有看到 5 秒后打印出的消息“hello”,而是得到了连续的“No messages”流。我究竟做错了什么?

最佳答案

问题是您正在使用 Queue.Queue ,它只处理同一进程内的多个线程,而不是多个进程。

multiprocessing 模块有自己的替代品 multiprocessing.Queue ,它提供相同的功能,但适用于线程和进程。

参见Pipes and Queuesmultiprocessing 文档中了解更多详细信息,但您可能不需要更多详细信息; multiprocessing.Queue 旨在尽可能接近 Queue.Queue 的多进程克隆。

<小时/>

如果您想了解幕后差异:

Queue.Queue 是一个带有条件变量的双端队列。它依赖于这样一个事实:在同一解释器中运行的代码可以访问相同的对象来共享双端队列,并使用条件变量来保护双端队列免受竞争以及信号发送。

multiprocessing.Queue 是一个更复杂的东西,它会腌制对象并通过进程之间的管道传递它们。竞争不是问题,但信号仍然是问题,因此它也具有条件变量的等效项,但显然不是来自线程的条件变量。

关于python - 多进程消息队列未接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49286818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com