如何编写一个多线程、非阻塞的python代码

一、【写在前面】

最近csdn每天写两篇文章有推广券,趁这个机会写一个python相关的文章吧。

一般我们的任务都可以分为计算密集型任务和IO密集型任务。

python因为全局GIL锁的存在,任何时候只有一个python线程在运行,所以说不能利用多核CPU的优势,这意味着python做计算密集型任务不是很合适。如果提升多核能力,使用multiprocess库或者其他语言写的库

但是在IO密集型任务中,在对速度和效率要求比较高的场景中,我们可以将python的多线程功能用起来。但是多线程必定bug多,这个是不可避免的,所以笔者也只敢在操作影响不大的地方写多线程

这篇文章写一个尽可能通用的python多线程非阻塞的代码示例

二、【名词解释】

1. 多线程

一个进程中可以有多个线程,好比饭店如果只有一个人,炒菜端菜都是一个人干,这就是单线程;

一个饭店有人切菜有人炒菜有人端菜,这就是三线程。

2. 线程之间的通信

而切菜的人把菜丢给炒菜的人,炒菜的人做好丢给端菜的人,这个过程叫做线程之间的通信

3. 线程阻塞

如果切菜的人是个浑浊懵愣的货,切完一个菜之后,厨师没有将菜收走,案板满了。这个切菜的人不愿意干活了,这就是阻塞。

4. 线程池

饭店老板非常有钱,每次有新的工作都会重新招一个人来干,这就叫创建新的线程。

饭店老板如果比较精明,有了新活都抓饭店里闲着的人干,而不招新的人,这就叫线程池。

5. 锁

饭店里只有一个卫生间,如果大家一起上卫生间会有人害羞而尿不出来。所以在员工上卫生间的时候需要加锁。程序中一般是在访问公共变量的时候需要加锁。

6. 线程导致的主程序退出

切菜的师傅切了个炸弹,然后厨师没有确认直接开炒,整个饭店都炸掉了。一般来说线程崩溃就崩溃了,但是如果主程序的某个流程是依赖线程结果的,那么线程崩溃就会把主程序带崩。

三、【代码编写】

这段代码是针对多台机器,每台机器的任务类似的一个多线程的主函数。照着这个往里塞东西就行

import time
import threading
from concurrent.futures import ThreadPoolExecutordef func1():passdef func2():passdef func3():passif __name__ == "__main__":# init global varsvars_dict = {}futures = {}# init locker 线程共用的变量要加锁否则会有奇奇怪怪的问题vars_dict_lock = threading.Lock()futures_lock = threading.Lock()# machine list 考虑有机器无法连接的情况Machine_List = ['machine1','machine2','machine3','cant_connected_machine']# prometheus metrix init 针对每个机器都有的变量,避免冗余代码可以这样初始化for host in Machine_List:## trading flag monitor belowvars_dict[f'var1_{host}']  = 'var1'vars_dict[f'var2_{host}']= 'var2'## end trading flag mon# 定义任务函数映射task_functions = {'describe for func1': func1,'describe for func2': func2,'describe for func3':func3}# multi thread task 线程池 10线程with ThreadPoolExecutor(max_workers=10) as executor:while True:with futures_lock:  # 每次操作公共变量需要操作锁for host in Machine_List:# 分别为每个任务创建一个唯一的键for task_name, task_func in task_functions.items():task_key = f"{task_name}_{host}"# 如果线程没有创建或没有完成,防止没跑完就起新的if task_key not in futures or futures[task_key].done():futures[task_key] = executor.submit(task_func, host)time.sleep(30)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字的位操作——326、504、263、190、191、476、461、477、693

326. 3 的幂(简单) 给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。 整数 n 是 3 的幂次方需满足:存在整数 x 使得 n 3x 示例 1: 输入&a…

程序员面试题------N皇后问题算法实现

N皇后问题是一个著名的计算机科学问题,它要求在NN的棋盘上放置N个皇后,使得它们之间不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题可以看作是一个回溯算法问题,通过逐步尝试不同的放置位置&#xf…

订单状态统计业务

文章目录 概要整体架构流程技术细节小结 概要 订单状态统计是电子商务、供应链管理、客户服务等多个领域中的一项核心业务需求. 需求分析以及接口设计 技术细节 1.Controller层: ApiOperation("各个状态的订单统计")GetMapping("/statistics")public Re…

检索增强生成(RAG):智能内容生成的新纪元

引言 在大 AI 时代,生成式人工智能(GenAI)模型,尤其是大型语言模型(LLM),已经展现出了令人瞩目的能力。然而,这些模型在提供信息的准确、即时、专业、权威等方面仍存在局限。检索增…

用Python打造精彩动画与视频,3.2 基本的剪辑和合并操作

3.2 基本的剪辑和合并操作 在这一节中,我们将学习如何使用 MoviePy 库对视频进行基本的剪辑和合并操作。MoviePy 是一个用于视频编辑的 Python 库,可以轻松地实现视频的剪辑、合并、添加音频等操作。 准备工作 首先,确保你已经安装了 Movi…

c++----类与对象(下)

当我们简单的学习了上一篇日期类。简单的理解并且使用了我们前面学习的知识。当然这还只是我们c的九牛一毛。并且我们的类与对象的知识还没学习完。今天我们来把类与对象的知识完善一下。 初始化列表 那么今天我们就不讲废话了,我们直接来主题。首先我们可以看到我…

防火墙Firewalld(iptables)

目录 一、Linux防火墙基础 1.什么是防火墙 2.防火墙的功能 3.防火墙的类型 二、Linux防火墙工具 1.iptables 2. netfilter 3.四表五链结构 3.1四表 3.2五链 3.3总结 4.数据包过滤的匹配流程 4.1规则表之间的顺序 4.2规则链之间的顺序 4.3规则链内的匹配顺序 …

项目实战_表白墙(升级版)

你能学到什么 表白墙(升级版)Mybatis的一些简单应用 正文 前⾯的案例中, 我们写了表⽩墙, 但是⼀旦服务器重启, 数据就会丢失. 要想数据不丢失, 需要把数据存储在数据库中,接下来咱们借助MyBatis来实现数据库的操作。 数据准备 如果我们…

Kubernetes Prometheus 系列 | AlertManager实现企业微信报警

helm部署prometheusgrafana直通车(与本文章关联) 首先注册企业微信:https://work.weixin.qq.com/ 目录 一、第一种根据企业id,应用secret等绑定二、第二种方式-添加群聊天机器人webhook(推荐) 前言&#x…

AI Agent学习系列:利用扣子智能体快速生成字体大小可控的金句海报

像这样的金句海报是如何生成的? 利用智能体可以轻松实现,还能控制字体大小,下面就介绍这个智能体的搭建过程。 一、创建扣子bot 打开扣子,点击“创建Bot”,手动创建一个bot。 在Bot创建页面输入Bot名称,比…

【项目实战】—— 高并发内存池

文章目录 什么是高并发内存池?项目介绍一、项目背景二、项目目标三、核心组件四、关键技术五、应用场景六、项目优势 什么是高并发内存池? 高并发内存池是一种专门设计用于高并发环境下的内存管理机制。它的原型是Google的一个开源项目tcmalloc&#xff…

SAP MM学习笔记50 - 分割评价(分别评估)

上一章讲了两个不太常用的物料类型,UNBW 和 NLAG。 学它的主要目的就是应付客户,因为根本就不好用,而客户还会很好奇的问这是啥东西呢? SAP MM学习笔记49 - UNBW - 非评价品目(未评估物料),NL…

【Golang 面试 - 基础题】每日 5 题(九)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

主题巴巴WordPress主题合辑打包下载+主题巴巴SEO插件

主题巴巴WordPress主题合辑打包下载,包含博客一号、博客二号、博客X、门户一号、门户手机版、图片一号、杂志一号、自媒体一号、自媒体二号和主题巴巴SEO插件。

【LLM大模型】AI大模型大厂面试真题:「2024大厂大模型技术岗内部面试题+答案」

AI大模型岗的大厂门槛又降低了!实在太缺人了,大模型岗位真的强烈建议各位多投提前批,▶️众所周知,2025届秋招提前批已经打响,🙋在这里真心建议大家6月7月一定要多投提前批! 💻我们…

html实现酷炫美观的可视化大屏(十种风格示例,附源码)

文章目录 完整效果演示1.蓝色流线风的可视化大屏1.1 大屏效果1.2 大屏代码1.3 大屏下载 2.地图模块风的可视化大屏2.1 大屏效果2.2 大屏代码2.3 大屏下载 3.科技轮动风的可视化大屏3.1 大屏效果3.2 大屏代码3.3 大屏下载 4.蓝色海洋风的可视化大屏4.1 大屏效果4.2 大屏代码4.3 …

createObjectURL的部分使用讲解

URL.createObjcetURL的部分详解 文章目录 URL.createObjcetURL的部分详解1. 为什么要使用createObjectURL2. createObjectURL的基本用法3. 转换后的文件进行展示或下载展示下载 首先,想记录一下这点是因为之前关于pdf文件的下载和预览,后端返回工作流时的…

正点原子imx6ull-mini-Linux驱动之阻塞IO和非阻塞IO实验(12)

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候 一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中 处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。 1&…

22. Hibernate 性能之缓存

1. 前言 本节和大家一起聊聊性能优化方案之:缓存。通过本节学习,你将了解到: 什么是缓存,缓存的作用;HIbernate 中的缓存级别;如何使用缓存。 2. 缓存 2.1 缓存是什么 现实世界里,缓存是一个…

html+css 实现遮罩按钮

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…