Python多线程填充Queue却始终为空问题求助
嘿,我帮你揪出了几个关键问题,这就是为什么你的队列始终是空的:
问题分析
1. 没有正确实例化类
你写了 sc = SomeClass,这仅仅是把类对象本身赋值给了变量,没有创建类的实例。而record是实例方法,它的第一个参数必须是类的实例(也就是self)。如果直接用类调用这个方法,你传入的jq队列会被当作self参数,真正需要的队列参数反而没传进record方法里——这就导致takes_awhile里的mq根本不是队列,自然没办法往队列中存入数据。
正确的实例化写法应该是:sc = SomeClass()。
2. Queue导入与使用的混淆
你同时导入了multiprocessing.Queue和Queue as Q,在多线程场景下,其实用标准库的Queue.Queue(Python2)/queue.Queue(Python3)更合适——multiprocessing.Queue是专门用于进程间通信的,线程间通信用标准库的Queue效率更高,也更匹配场景。
修复后的代码
#!/usr/bin/python import threading import Queue as Q import time from random import randint class SomeClass: def takes_awhile(self, mq): qjson = {} time.sleep(5) qjson.update({"randint": randint(1, 9)}) mq.put(qjson) def record(self, jq): while True: self.takes_awhile(jq) time.sleep(0.05) # 修复:正确实例化类 sc = SomeClass() # 修复:使用线程安全的标准库Queue jq = Q.Queue() # 现在sc是实例,record方法会自动绑定self,只需传入队列参数 scp = threading.Thread(target=sc.record, args=(jq,)) scp.start() def qprint(): try: rv = jq.get_nowait() except Q.Empty: return "Empty" return rv while True: print qprint() time.sleep(0.1) # 加个小延迟,避免循环过度占用CPU
修复后的效果
运行代码后,前5秒会持续打印Empty;5秒后开始输出带随机数的字典,之后每隔0.05秒会有新数据存入队列,qprint会不断取出这些数据输出。
内容的提问来源于stack exchange,提问作者CuriOne
相关产品推荐
相关产品推荐

