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

Python线程无限挂起问题求助:Queue相关代码排查

解决你的线程挂起问题:Queue模块阻塞行为分析

嘿,我看了你的代码和描述,马上就发现问题所在了——你的线程大概率是卡在queue.Queue.get()的阻塞调用上了,给你详细分析并附上可行的解决方案:

问题根源

你的代码里有两个关键点导致线程看起来“挂起”:

  • queue.Queue.get()默认是阻塞模式:当队列里没有元素时,调用这个方法的线程会一直暂停等待,直到有新元素被放入队列,这是Queue模块的正常设计,但如果没有退出逻辑,就会让线程一直处于这个等待状态。
  • 线程用了while True死循环:没有任何退出条件,哪怕你已经把所有要处理的数字都放入队列,线程也不会自动结束,会一直卡在get()那里。

解决方案

这里给你三种不同场景下的解决方案,你可以根据自己的需求选择:

方案1:添加终止标记(最常用)

在队列里放入一个特殊的“停止信号”(比如None),当线程取到这个信号时,就退出循环:

from threading import Thread
import queue

def print_number(number_queue_display):
    while True:
        number = number_queue_display.get()
        # 检测到终止标记就退出
        if number is None:
            break
        print(number)
        number_queue_display.task_done()
    # 给终止标记也做一次task_done,确保join能正常结束
    number_queue_display.task_done()

number_queue = queue.Queue()
printing_numbers = Thread(target=print_number, args=(number_queue,))
printing_numbers.start()

number_queue.put(5)
number_queue.put(10)
# 放入终止标记
number_queue.put(None)

# 等待队列所有任务处理完成
number_queue.join()
# 等待线程完全结束
printing_numbers.join()

方案2:给get()设置超时时间

如果你不想用终止标记,可以给get()加个超时时间,超时后捕获queue.Empty异常并退出线程:

from threading import Thread
import queue

def print_number(number_queue_display):
    while True:
        try:
            # 设置3秒超时,可根据实际情况调整
            number = number_queue_display.get(timeout=3)
            print(number)
            number_queue_display.task_done()
        except queue.Empty:
            # 队列为空且超时,退出循环
            break

number_queue = queue.Queue()
printing_numbers = Thread(target=print_number, args=(number_queue,))
printing_numbers.start()

number_queue.put(5)
number_queue.put(10)

# 等待队列任务完成
number_queue.join()
# 等待线程结束
printing_numbers.join()

方案3:设置守护线程(适合主进程结束即停止的场景)

如果你希望主进程结束时,线程自动退出,可以把线程设为守护线程,但要注意这种方式下线程可能会被强制终止,只适合允许中途停止的场景:

from threading import Thread
import queue

def print_number(number_queue_display):
    while True:
        number = number_queue_display.get()
        print(number)
        number_queue_display.task_done()

number_queue = queue.Queue()
# 设置daemon=True,主进程结束时线程自动退出
printing_numbers = Thread(target=print_number, args=(number_queue,), daemon=True)
printing_numbers.start()

number_queue.put(5)
number_queue.put(10)

# 等待队列所有任务处理完
number_queue.join()
# 主进程结束,守护线程自动终止

另外你代码最后一行number_que...看起来没写完,如果还有其他没贴出来的逻辑,也可能是其他问题,但基于现有代码,最可能的就是上述的阻塞问题啦。

内容的提问来源于stack exchange,提问作者user9726721

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:40:52