使用Thread和队列Queue实现线程池复用线程

news2024/11/25 7:54:18

线程池实现

线程池是一个线程管理技术,创建一个或者多个线程进行管理,避免线程的创建和销毁带来的开销线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度.
  • 线程池的优点
    • 降低资源消耗;通过重复利用已创建的线程降低创建和销毁造成的消耗。
    • 提高响应速度,不必等待线程的创建,正常情况下(没有任务进入队列的情况)不需要等待。
    • 线程管理,线程统一由线程池管理,随取随用。

自定义线程池实现

from threading import Thread
from queue import Queue
import time
import random
import threading


# 自定义线程池
class MyThreadPool(Thread):

    def __init__(self, thread_num, task_queue):
        super().__init__()
        self.daemon = True
        self.thread_num = thread_num
        self.task_queue = task_queue
        self.threads = None
        # 初始化的时候启动线程池
        self.__start()

    def run(self):
        while True:
            target, args, kwargs = self.task_queue.get()
            target(*args, **kwargs)
            # 队列计数器减一
            self.task_queue.task_done()

    # 重写父类join 方法,将等待结束条件修改为: 任务队列执行完成
    def join(self):
        self.task_queue.join()

    def __start(self):
        self.threads = self.__create_threads()
        for thread in self.threads:
            thread.start()

    def __create_threads(self):
        return [MyThreadPool(0, self.task_queue) for _ in range(self.thread_num)]

    def join_all(self):
        for thread in self.threads:
            thread.join()

    def submit_task(self, target, args=(), kwargs={}):
        self.task_queue.put((target, args, kwargs))


def work(name, no, **kwargs):
    print(f"【子线程{no}-开始】({threading.current_thread()}) ")
    print(f"【子线程{no}-data】 name={name}, no={no}, kwargs={kwargs}")
    time.sleep(random.randint(1, 10))
    print(f"【子线程{no}-结束】({threading.current_thread()})")


q = Queue()

t_pool = MyThreadPool(3, q)
for i in range(5):
    t_pool.submit_task(work, (f"任务{i}", i), {"test": 1})

t_pool.join_all()

【运行效果】:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【BUG历险记】vivado报错:binding vhdl entity ‘ xxxxx ‘does not have port ‘ xxxxx ‘解决方案

🏔【BUG历险记】vivado报错:binding vhdl entity xxxxx does not have port xxxxx 解决方案 问题描述 我在编写雷达的脉冲压缩仿真时,先例化了FFT和复数乘法器,并仿真验证通过了;再例化IFFT,结果仿真时…

可信区块链运行监测服务平台(TBM)正式发布

6月29日,“Web3.0信任科技大会”于长沙开幕,大会由长沙市人民政府、中国信息通信研究院、中国通信标准化协会联合主办,长沙市委网络安全和信息化委员会办公室、长沙市工业和信息化局、长沙经济技术开发区管理委员会、可信区块链推进计划和中国…

leetcode周赛352

leetcode周赛352 1. 最长奇偶子数组 思路分析 这是一道变形的双指针题目我们可以使用相关算法模板基础上来书写左边界:偶数,且小于值threshold;所以我们需要寻找符合要求的左边界判断是否奇偶相间:只有 奇数偶数奇数 class Solution {static…

国产MCU-CW32F030开发学习--移植rtthread-nano

国产MCU-CW32F030开发学习–移植rtthread-nano 硬件平台 CW32_48F大学计划板CW32_IOT_EVA物联网开发评估套件 RT-Thread Nano RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格&…

git clone 丢东西

1. git clone 丢东西 使用git clone https://gitee.com/123456789/123456789.git 克隆gitee 远程库上的代码发现少了一部分,只克隆了一部分下来,反复删除重新克隆都是一样的结果 2. 克隆下来后的文件,该目录下只有5 个文件,少了…

一文读懂北斗三号短报文!通信频度、电文长度、北斗民用智能卡申请、典型终端全面介绍

一、北斗短报文概述 北斗卫星导航系统(Beidou Navigation Satellite System)是中国自主研发和建设的全球卫星导航系统。该系统由一系列卫星、地面监控站和用户终端组成,旨在提供高精度、高可靠性的定位、导航和授时服务。北斗卫星导航系统的发…

QT编写的数字键盘

https://download.csdn.net/download/qq_20189555/88001237

Heroku 实践:如何成功将 Vue.js 的前端内容部署到 Heroku

文章目录 Vue.js 脚手架安装Vue CLI(如果你还没有安装):创建新项目 Heroku 部署 Vue2项目目录server.jspackage.json创建 Procfile按照 heroku 的引导初始化 git 并提交代码 可能问题 Vue.js 脚手架 首先要使用 Vue 的脚手架来创建一个 vue …

nodeJs学习笔记

创建服务器 在根目录下创建server.js的文件,里面写如入以下代码: // 请求nodejs自带的http模块 var http require(http);http.createServer(function (request, response) {// 发送 HTTP 头部 // HTTP 状态值: 200 : OK// 内容类型: text/plainrespon…

Update the WSL kernel by running “wsl --update“ or……【老电脑装Docker】

给老电脑装Docker遇到了这个问题记录一下 Update the WSL kernel by running “wsl --update” or follow instructions at https://docs.microsoft.com/windows/wsl/wsl2-kernel. 打开Docker一直报这个界面,然后就退出 根据上面的意思,试着更新了下 …

汇编学习教程:走进 bp

引言 此前我们学习了 bp 寄存器,我们知道 bp 的作用是为访问栈空间数据提供方便,其默认绑定的段寄存器就是 SS 段寄存器。在此前的博文中博主提及到,bp 的作用其实不止方便访问栈空间数据这一条,对于栈如此重要的空间&#xff0c…

区块链技术:解锁未来的去中心化革命

在数字时代的浪潮中,区块链技术如一颗璀璨的明星崛起,被誉为解锁未来的去中心化革命。作为一种分布式账本技术,区块链不仅改变着传统商业模式,还催生了全新的经济形态和社会关系。本文将从技术原理、应用场景和前景展望三个方面&a…

spring security权限路由匹配restful格式的详情id设计

解决方案: 先直接说下解决方案,权限点设计成如下: /api/books/{id:\d*}问题描述: 获取书本详情的标准restful路由,一般是这样的/api/books/12, 12即该book的id,如果需要拥有访问该路由的权限…

【C语言初阶】带你轻松掌握指针基础知识(1)——指针的定义,类型,大小

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,这里是君兮_,最近刚回家有点懒,从今天开始恢复更新并开始更新新的刷题系列,我们先继续更新0基础入门C语言的内容,今天给大家带来的是指针方面的内容&…

【MYSQL基础】MYSQL用户管理

MYSQL用户管理 数据库的root用户拥有操作数据库的所有权限,如果要团队协作开发,为了避免有成员误操作,可以给成员创建一个权限较低的用户账号 创建用户 create user 用户名 identified by ‘密码’; mysql> create user dam identified …

数据劫持大揭秘:Vue的隐形力量和无限可能

文章目录 1. 初始化阶段2. 响应式侦测器3. 数据劫持4. 模板编译5.总结 Vue.js 通过数据劫持实现了数据的双向绑定。它使用了一个名为 “响应式系统” 的机制来追踪和响应数据的变化,从而自动更新相关的视图。 Vue 的数据劫持原理主要分为以下几个步骤: …

main函数和其他函数

##什么是main函数函数就很敏感,在我认为的函数函数就是功能 有系统给的也有自己写的 函数就是一个封装好的功能 function 函数,功能。main函数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9a92f39cf6a842f5a56dbc1689012ceb.png 函数的参数&am…

高压放大器工作原理以及参数介绍

高压放大器是一种电子器件,其主要作用是将输入信号的电压放大到输出端。由于高压放大器的输入和输出端的电平差很大,因此需要使用特殊的材料和技术来保证电路的可靠性和稳定性。下面我们就来详细介绍一下高压放大器的工作原理和参数介绍。 图&#xff1a…

推荐4款好用的在线作图软件,可一键安装

本文将介绍4个功能强大又可以免费使用的在线作图软件,可以帮助设计师更快地完成绘图工作,一起来看看吧! 1.即时设计 即时设计是一款功能强大的在线作图软件,它提供了丰富的绘图工具、层管理和样式库,让设计师可以轻松…

集群 第二章

目录 1.DR 模式 LVS 负载均衡群集部署 2.总结 1.DR 模式 LVS 负载均衡群集部署 DR 服务器: 192.168.83.104 NFS服务器: 192.168.83.103 Web 服务器1: 192.168.83.102 Web 服务器2: 192.168.83.101 …