You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:45:56