Python常用模块threading与Thread线程池实战指南

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

Python多线程编程中,频繁创建销毁线程会消耗大量系统资源。通过引入线程池可实现任务的复用与高效调度。本文解析线程池的生产者-消费者模型,提供基于标准库的自定义实现方案,并详细拆解multiprocessing内置线程池的任务提交、生命周期管理与阻塞控制流程。

线程池核心概念与运行机制

线程池架构示意图展示主线程提交任务与池内空闲线程接收执行的过程
主线程负责任务分发,线程池负责队列管理与线程复用

线程池的运行遵循典型的生产者与消费者模型:

  • 主线程(生产者):仅负责向线程池内部的任务队列提交待执行函数与参数,无需感知底层的具体执行路径。
  • 线程池(消费者):预先创建固定数量的工作线程常驻后台,持续轮询任务队列。一旦获取到待处理对象,立即分配给空闲的工作线程执行。

该设计有效避免了高频线程创建与上下文切换带来的性能损耗,特别适合IO密集型并发场景。

基于Queue与Threading自定义线程池

借助Python内置的threading与queue模块,可以轻量级构建支持异步提交的线程池类。核心逻辑包含初始化守护线程、循环消费队列以及同步等待任务完成。

# -*- coding: utf-8 -*-
from threading import Thread
from queue import Queue
import time

class ThreadPool:
    def __init__(self, n):
        self.queue = Queue()
        # 创建指定数量的守护线程并启动
        for i in range(n):
            Thread(target=self.worker, daemon=True).start()

    # 线程工作循环
    def worker(self):
        while True:
            # 阻塞获取队列中的任务元组
            func, args, kwargs = self.queue.get()
            try:
                func(*args, **kwargs)
            finally:
                self.queue.task_done()

    # 异步提交任务
    def apply_async(self, target, args=(), kwargs=None):
        if kwargs is None:
            kwargs = {}
        self.queue.put((target, args, kwargs))

    # 阻塞主线程直到所有任务完成
    def join(self):
        self.queue.join()

def task_func(x):
    print(f'正在执行任务 {x}')
    time.sleep(2)
    print(f'任务 {x} 执行完毕')

# 初始化含2个工作线程的池
t = ThreadPool(2)
for i in range(5):
    t.apply_async(task_func, args=(i,))
print('全部任务已入队,等待执行结束...')
t.join()
print('所有线程池任务已完成')
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表