Python多线程和队列操作实例

阿麦
阿麦
发布时间:2026-10-12| 1人浏览过
原创

本文展示Python中基于threading模块与queue队列实现多线程生产者-消费者模型的完整代码。通过自定义线程类交替执行数据写入与读取,并结合daemon线程属性、join阻塞机制及task_done任务的调用逻辑,说明如何在循环场景中维持程序持续运行或避免意外退出。

Python多线程基础交互示例

在Python并发编程中,处理多个线程间的数据流转最安全的方式是使用内置的queue.Queue对象。该队列天然具备线程安全性,多个线程同时进行读写时无需手动添加锁(Lock),即可自动处理阻塞与唤醒机制。

以下示例演示了一个基础的生产者-消费者结构:一个线程每隔1秒向队列放入递增数字,另一个线程不断从队列中取出数字并打印至终端。由于涉及无限循环场景,需特别注意join()与task_done()的配合逻辑,否则会导致脚本提前结束或主进程永久卡死。

完整代码实现与操作步骤

运行本示例前,请确保环境已安装Python 3。queue与threading均为标准库,无需额外安装。

第1步:初始化共享队列

在主函数main中实例化工作队列work_queue = queue.Queue(),后续所有线程均通过参数传入此对象,实现数据通道统一。

第2步:编写生产者与消费者线程类

继承threading.Thread并重写__init__与run方法。生产者负责周期性put()数据,消费者负责持续get()数据。注意子类构造时必须调用父类初始化super().__init__()。

# ! /usr/bin/env python3
import time
import threading
import queue

class Producer(threading.Thread):
    def __init__(self, work_queue):
        super().__init__()
        self.work_queue = work_queue
        
    def run(self):
        num = 1
        while True:
            self.work_queue.put(num)
            num += 1
            time.sleep(1)

class Printer(threading.Thread):
    def __init__(self, work_queue):
        super().__init__()
        self.work_queue = work_queue

    def run(self):
        while True:
            num = self.work_queue.get()
            print(num)

第3步:配置线程属性并启动

将生产者和消费者线程标记为守护进程(daemon = True),确保当主线程异常终止时,子线程可自动跟随退出而不会阻塞进程关闭。随后调用.start()激活两个线程。

def main():
    work_queue = queue.Queue()
    
    producer = Producer(work_queue)
    producer.daemon = True
    producer.start()
    
    printer = Printer(work_queue)
    printer.daemon = True
    printer.start()
    
    # 关键阻塞点
    work_queue.join()

join()与task_done()的运行逻辑解析

代码末尾的work_queue.join()会让主线程暂停,直到队列中所有被取出的元素都标记为完成。若在num = self.work_queue.get()后追加self.work_queue.task_done(),队列计数将立即归零,join()会瞬间返回,导致程序仅打印一次“1”便直接结束。

当前循环场景未调用task_done(),因此join()将一直等待直到用户强制中断(如按Ctrl + C)。这种设计适用于需要后台持续监听或流水线作业的场景。若业务需求改为“处理完当前批次即退出”,则必须正确配对task_done()。

详细API文档参考:https://docs.python.org/3/library/queue.html

常见问题排查

  • 程序无响应或卡在最后一步:属于正常现象。因为调用了join()且未使用task_done(),主线程会主动阻塞以维持双线程循环运行。
  • 输出只有第一个数字就停止:检查是否在get()之后误加了task_done()。在无限循环模式下,这会触发过早退出机制。
  • 线程安全警告:请勿使用普通列表(List)替代queue.Queue进行跨线程传值,标准Queue内部已封装互斥锁与条件变量。

以上就是Python多线程和队列操作的详细内容,更多关于Python并发编程与线程同步的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。