首页 > 编程语言 >python实现自定义线程池

python实现自定义线程池

时间:2024-06-10 11:44:56浏览次数:28  
标签:task 自定义 python self idle 线程 ._ 空闲

线程池ThreadPool对象的几个关键方法:

  • get_idle_num(): 获得当前空闲线程的数量
  • submit(task:callable): 把一个任务(实际上就是一个函数)提交到线程池中执行. 如果没有空闲线程则阻塞.
  • wait_idle(): 阻塞, 直到有空闲线程
  • stop(): 停止线程池中的所有线程. (注意: 非强制停止, 需要现有任务执行完毕.)

源码如下:

import queue
import threading
import time

class ThreadPool:
    '''线程池'''
    def __init__(self) -> None:
        self.threads_num = 3
        '''线程的数量'''
        self.idle_count = self.threads_num
        '''空闲线程的数量'''
        self._lock = threading.Lock()
        '''线程锁'''
        self._semaphore = threading.Semaphore(self.threads_num)
        '''信号量, 用于控制线程是否空闲'''
        self.task_queue = queue.Queue()
        '''任务队列'''
        self.threads:list[threading.Thread] = []
        '''线程列表'''
        self._start()
    def get_idle_num(self)->int:
        '''获取空闲线程的数量'''
        return self.idle_count
    def join(self):
        '''等待所有线程执行完毕'''
        for thread in self.threads:thread.join()
    def _start(self):
        '''启动线程池'''
        for _ in range(self.threads_num):
            thread = threading.Thread(target=self._worker, daemon=True)  # 创建线程
            thread.start()
            self.threads.append(thread)
    def stop(self):
        '''停止线程池'''
        # 通过向任务队列中添加None,来终止线程
        for _ in range(self.threads_num): self.task_queue.put(None)
    def submit(self, task:callable):
        '''提交任务到线程池. 如果没有空闲线程, 则会阻塞'''
        self._semaphore.acquire()  # 等待有线程空闲
        self.task_queue.put(task)
    def wait_idle(self):
        '''等待有线程空闲'''
        # 通过信号量控制,当空闲线程数量为0时,信号量会阻塞
        with self._semaphore: pass
    def _worker(self):
        '''线程工作函数'''
        while True:
            task = self.task_queue.get()  # 从队列中取出一个任务执行
            if task is None: 
                self._semaphore.release()  # 释放信号量,通知其他线程
                break  # 用于终止线程的方式
            # 空闲的线程数量减1
            with self._lock: self.idle_count -= 1
            task()  # 执行任务
            # 任务执行完毕,空闲的线程数量加1
            with self._lock: self.idle_count += 1
            #self.task_queue.task_done()  # 通知任务队列,任务完成
            self._semaphore.release()  # 释放信号量,通知其他线程
            
if __name__ == '__main__':
    '''测试线程池'''
    pool = ThreadPool()
    pool.wait_idle()
    print('ok')
    pool.submit(lambda: time.sleep(10))
    pool.submit(lambda: time.sleep(15))
    pool.submit(lambda: time.sleep(20))
    #time.sleep(0.001)
    pool.wait_idle()
    print('ok1')
    print(pool.get_idle_num())
    pool.stop()
    pool.join()
    print('ok2')

标签:task,自定义,python,self,idle,线程,._,空闲
From: https://www.cnblogs.com/huzhongqiang/p/18240521

相关文章

  • Python 中 `return` 语句的主要作用
    在Python中,`return`语句用于从函数中返回一个值,并终止函数的执行。`return`语句是函数中最重要的控制流语句之一,它决定了函数的输出和执行流程。以下是`return`语句的主要作用和一些示例:###主要作用1. 返回值:  -`return`语句将一个值(或多个值)从函数传递给调用者。这......
  • python里装饰器的作用是什么
    在Python中,装饰器(decorator)是一种高级函数,用于修改或扩展其他函数或方法的行为,而无需直接修改它们的代码。装饰器常用于以下场景:日志记录:记录函数的调用信息,如函数名、参数和返回值。权限验证:在执行函数前检查用户是否有权限。性能测量:测量函数的执行时间。缓存:缓存函数的返回......
  • Python魔法之旅-魔法方法(25)
    目录一、概述1、定义2、作用二、应用场景1、构造和析构2、操作符重载3、字符串和表示4、容器管理5、可调用对象6、上下文管理7、属性访问和描述符8、迭代器和生成器9、数值类型10、复制和序列化11、自定义元类行为12、自定义类行为13、类型检查和转换14、自......
  • Python魔法之旅-魔法方法(23)
    目录一、概述1、定义2、作用二、应用场景1、构造和析构2、操作符重载3、字符串和表示4、容器管理5、可调用对象6、上下文管理7、属性访问和描述符8、迭代器和生成器9、数值类型10、复制和序列化11、自定义元类行为12、自定义类行为13、类型检查和转换14、自......
  • Python中的异常处理详解
    异常处理是编程中常见的一项任务,用于处理程序在运行时可能发生的错误情况。Python提供了强大的异常处理机制,使得开发者能够更好地控制和处理程序的异常情况。本文将深入探讨Python中的异常处理,包括异常的基本概念、异常处理语句、异常类型以及如何自定义异常。目录异常的......
  • 第1讲:进程和线程
    扫盲课。对Linux系统下,进程和线程的基本概念和对比进行阐述。一、进程进程是处于执行期的程序及相关资源的总称。操作系统为进程提供两种虚拟机制:虚拟处理器&虚拟内存,目的是让进程有一种假象:“独享处理器和整个内存空间”。关于进程描述符structtask_struct放在后续内容......
  • 基于Python的桌面定时提醒小程序
     分享一个自己之前做的小程序,主要功能有两个:可以间隔固定时间弹窗提醒,间隔的时间以及重复的次数可以自己选定,提示的内容也可以手动输入;设定具体的时间点,定时提醒,提示的内容也可以手动输入;自己用了这个小程序已经快两年了,感觉体验还不错,所以就拿出来分享下,小程序是用Python......
  • Python 机器学习基础:掌握 Pandas 数据处理库的奥秘
    在Python的机器学习领域中,Pandas是一个不可或缺的工具。它不仅提供了强大的数据结构,还拥有数据处理和分析的能力,是数据科学家和机器学习工程师的得力助手。本文将深入探讨Pandas的核心功能,并通过实际案例,展示其在机器学习项目中的关键作用。1.Pandas简介Pandas是......
  • python打印一颗桃花树
     以下是使用Python的turtle库来绘制一棵梅花树,并添加落叶效果的代码:importturtleimportrandom#设置画布和画笔canvas=turtle.Screen()canvas.bgcolor("black")pen=turtle.Turtle()pen.speed(0)pen.penup()pen.left(90)pen.backward(200)pen.pendown()#......
  • 大学生如何高效学习Python
     在数字化时代,编程技能已成为大学生必备的技能之一。Python,以其简洁的语法和强大的功能,成为了最受欢迎的编程语言之一。对于大学生来说,掌握Python不仅能够提升个人的竞争力,还能在学术和职业发展中发挥重要作用。1.明确学习目标首先,大学生应该明确自己学习Python的目的。是......