Python多线程—threading模块
参考:《Python核心编程》
threading 模块的Thread 类是主要的执行对象,而且,使用Thread类可以有很多方法来创建线程,这里介绍以下两种方法:
- 创建 Thread 实例,传给它一个函数。
- 派生 Thread 的子类,并创建子类的实例。
如果是有面向对象接口需求的,第二种方法更加符合。
1、创建Thread的实例,传给它一个函数
示例代码:
from threading import Thread
from time import sleep, ctimeloops = [4, 2]def loop(nloop, nsec):print("start loop ", nloop, " at ", ctime())sleep(nsec)print("nloop ", nloop, " done at ", ctime())def main():threads = []print("starting at: ", ctime())# create all threadsfor i in range(len(loops)):t = Thread(target=loop, args=(i, loops[i]))threads.append(t)# start threadfor i in range(len(loops)):threads[i].start()# wait for all threads to finishfor i in range(len(loops)):threads[i].join()print("all DONE at: ", ctime())if __name__ == "__main__":main()
执行脚本:
$ python myThread.py
starting at: Sat Jan 20 17:22:28 2024
start loop 0 at Sat Jan 20 17:22:28 2024
start loop 1 at Sat Jan 20 17:22:28 2024
nloop 1 done at Sat Jan 20 17:22:30 2024
nloop 0 done at Sat Jan 20 17:22:32 2024
all DONE at: Sat Jan 20 17:22:32 2024
- 在上述代码中,当实例化每个 Thread 对象时,把函数(target)和参数(args)传进去,然后得到返回的 Thread 实例。实例化 Thread 后,线程不会立即开始执行,而是把启动的指挥权交给程序员,这是一个非常有用的同步功能,尤其是当你并不希望线程开始立即执行时。
- 当所有线程都分配完成之后,通过调用每个线程的 start()方法让它们开始执行。
- join()方法将等待当前(或所有)线程结束后再往下执行。一旦线程启动,它们就会一直执行,直到给定的函数完成后退出。如果主线程还有其他事情要去做,而不是等待这些线程完成(例如其他处理或者等待新的客户端请求),就可以不调用 join()。join()方法只有在你需要等待线程完成的时候才是有用的。比如,如果将 join() 方法所在的 for 循环注释掉,那么执行脚本后将会得到下面这样的结果:
$ python myThread.py
starting at: Sat Jan 20 17:45:16 2024
start loop 0 at Sat Jan 20 17:45:16 2024
start loop 1 at Sat Jan 20 17:45:16 2024
all DONE at: Sat Jan 20 17:45:16 2024
nloop 1 done at Sat Jan 20 17:45:18 2024
nloop 0 done at Sat Jan 20 17:45:20 2024
2、派生 Thread 的子类,并创建子类的实例
当创建线程时使用子类要相对更容易阅读,而且如上所述,当你需要一个更加符合面向对象的接口时,
会选择这种方法。下面的示例中将对 Thread 子类化,而不是直接对其实例化。这将使我们在定制线程对象时拥有更多的灵活性,也能够简化线程创建的调用过程。
示例代码:
from threading import Thread
from time import sleep, ctimeloops = [4, 2]class MyThread(Thread):def __init__(self, func, args, name=''):Thread.__init__(self) # 调用基类构造方法self.func = funcself.args = argsself.name = namedef run(self):self.func(*self.args)def loop(nloop, nsec):print("start loop ", nloop, " at ", ctime())sleep(nsec)print("loop ", nloop, "done at ", ctime())def main():threads = []# 创建线程for i in range(len(loops)):t = MyThread(func=loop, args=(i,loops[i]), name=loop.__name__)threads.append(t)# 启动线程for i in range(len(loops)):threads[i].start()# 等待所有线程执行完毕for i in range(len(loops)):threads[i].join()print("all DONE at ", ctime())if __name__ == "__main__":main()
执行脚本:
$ python myThread2.py
start loop 0 at Sat Jan 20 18:49:51 2024
start loop 1 at Sat Jan 20 18:49:51 2024
loop 1 done at Sat Jan 20 18:49:53 2024
loop 0 done at Sat Jan 20 18:49:55 2024
all DONE at Sat Jan 20 18:49:55 2024
- MyThread 子类的构造函数必须先调用其基类的构造函数。
- 当创建新线程时,Thread 类的代码将调用 MyThread 对象,此时会调用__run__()这个特殊方法。
补:Thread 对象的属性和方法


相关文章:
Python多线程—threading模块
参考:《Python核心编程》 threading 模块的Thread 类是主要的执行对象,而且,使用Thread类可以有很多方法来创建线程,这里介绍以下两种方法: 创建 Thread 实例,传给它一个函数。派生 Thread 的子类…...
mysql limit
语法 SELECT * FROM TABLE_NAME LIMIT 起始位置,偏移量注: 起始位置从0开始 示例 查询的第1条数据到第100条数据 limit 0,100查询的第101条数据到第200条数据 limit 100,100注意不要用 limit 101,100示例2 limit 语句应放在order by语句后面执行 …...
解决国内Linux服务器无法使用Github的方法
解决思路:修改Host https://www.ipaddress.com/ 利用上面的网站查询github.com和raw.githubusercontent.com的DNS解析的IP地址 最后,修改服务器的/etc/hosts 添加如下两行: 140.82.112.3 github.com 185.199.108.133 raw.githubuserconte…...
动态规划基础(二)最长公共子序列 LCS
讲解求两个串中最长的公共的子序列长度或输出子序列等 poj1458 题目大意 给定两个字符串,要求输出两个字符串中最长公共子序列长度 思路 我们定义 a [ i ] [ j ] a[i][j] a[i][j]为,当字串 s t r 1 str1 str1到 i i i位置,字串 s t r 2 s…...
React配置src根目录@
文章目录 1.打开webpack配置文件2.配置webpack 1.打开webpack配置文件 yarn eject or npm run eject 如果报错了记得提前 git commit一下 2.配置webpack 找到 webpack.config.js 文件在 webpack.config.js 文件中找到 alias 配置在alias里添加: path.resolve(src) , 或者 : pa…...
SQL Povit函数使用及实例
PIVOT函数常用于数据的行转列,同时也可以用此函数实现类似于Excel中的数据透视表的效果。 PIVOT函数 PIVOT 函数的基本语法如下: -- PIVOT 语法 SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>,.…...
Lite AD的安装
1、Lite AD的安装及配置 Lite AD流程: (1)创建一个新的Windows 10,安装tools,再安装ITA组件(安装Lite AD会自动安装VAG/VLB) (2)创建一个新的Windows 10,安…...
限流算法之流量控制的平滑之道:滑动时间窗算法
文章目录 引言简介优点缺点样例样例图样例代码 应用场景结论 引言 在互联网应用中,流量控制是一个重要的组件,用于防止系统过载和保护核心资源。常见的限流算法包括固定窗口算法和滑动时间窗算法。本文将重点介绍滑动时间窗算法,并分析其优缺…...
C语言数据结构——顺序表
(图片由AI生成) 0.前言 在程序设计的世界里,数据结构是非常重要的基础概念。本文将专注于C语言中的一种基本数据结构——顺序表。我们将从数据结构的基本概念讲起,逐步深入到顺序表的内部结构、分类,最后通过一个实…...
网络安全:守护数字世界的盾牌
在当今数字化的时代,网络已经渗透到我们生活的方方面面。从社交媒体到在线银行,从在线购物到工作文件传输,网络几乎无处不在。然而,随着网络的普及,网络安全问题也日益凸显。那么,如何确保我们的数字资产安…...
vue3hooks的使用
hook是钩子的意思,看到“钩子”是不是就想到了钩子函数?事实上,hooks 还真是函数的一种写法。 vue3 借鉴 react hooks 开发出了 Composition API ,所以也就意味着 Composition API 也能进行自定义封装 hooks。 vue3 中的 hooks …...
elementUI+el-upload 上传、下载、删除文件以及文件展示列表自定义为表格展示
Upload 上传组件的使用 官方文档链接使用el-upload组件上传文件 具体参数说明,如何实现上传、下载、删除等功能获取文件列表进行file-list格式匹配代码 文件展示列表自定义为表格展示 使用的具体参数说明文件大小展示问题(KB/MB)文件下载代码…...
供应链安全项目in-toto开源框架详解
引言:in-toto 是一个开源框架,能够以密码学的方式验证构件生产路径上的每个组件和步骤。它可与主流的构建工具、部署工具进行集成。in-toto已经被CNCF技术监督委员会 (Technical Oversight Committee,TOC)接纳为CNCF孵化项目。 1. 背景 由于…...
自己是如何使用单元测试
前言 自己是如何使用单元测试 进行单元测试能够让我们在编写方法的具体实现代码后,能清晰地看到其是否能实现预期的功能,有助于我们及时修正自己方法中存在的bug,以免在后续使用到某方法时出现意想不到的错误。 一、引入单元测试所使用的依赖…...
第二百七十八回
文章目录 1. 概念介绍2. 使用方法2.1 DropdownMenu2.1 DropdownMenuEntry 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何禁止页面跟随手机自动旋转"相关的内容,本章回中将介绍DropdownMenu组件.闲话休提,让我们一起Talk Flutter吧。 1.…...
Java 内存模型深度解析
优质博文:IT-BLOG-CN 一、并发编程模型的两个关键问题 【1】并发中常见的两个问题:线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:内存共享和消息传递&…...
python爬取图片(thumbURL和html文件标签分别爬取)
当查看源代码,发现网址在thumbURL之后时,用此代码: # 当查看源代码,发现网址在thumbURL之后时,用此代码:import requestsheaders {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121…...
MySQL、Oracle 常用SQL:建表、建视图、数据增删改查、常用condition
目录 1 MySQL、Oracle 建表语句整理1.1 MySQL 建表1.2 Oracle 建表1.3 补充1.3.1 主键:新增、删除1.3.2 字段:新增、修改、删除 2 MySQL、Oracle 建视图3 数据:增删改查3.1 插入数据3.1.1 MySQL、Oracle 插入一条数据3.1.2 MySQL、Oracle 插入…...
Docker(八)高级网络配置
作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 高级网络配置 注意:本章属于 Docker 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习…...
VUE--- ref refs
ref & refs 的作用:用于获取dom元素或组件实例,也可用于组件组件间数据的获取和修改 ref & refs 与querySelector的区别: ● ref & refs 查找的范围是当前组件内,更加精确稳定 ● querySelector 查找的范围是整个页面…...
告别串口助手!用手机APP和ESP-01S模块,5分钟搞定51单片机无线控制LED
手机APP直连ESP-01S:零门槛实现51单片机LED无线控制 在物联网原型开发中,摆脱串口助手的束缚,直接用手机APP控制硬件设备,是许多初学者的迫切需求。本文将带你用最常见的ESP-01S模块和任意一款TCP调试APP,在5分钟内搭建…...
Perplexity历史资料搜索突然变慢?——2023-2024真实日志分析揭示3类服务器端降级行为及绕行方案
更多请点击: https://kaifayun.com 第一章:Perplexity历史资料搜索突然变慢?——2023-2024真实日志分析揭示3类服务器端降级行为及绕行方案 2023年Q4至2024年Q2期间,多位研究者与开发者反馈Perplexity Pro用户的历史资料搜索&am…...
定向井轨迹控制关键技术:200℃高温定向传感器的随钻测量应用指南
一、引言 定向井钻井技术是现代油气资源开发的核心支撑技术之一,通过精确控制井眼轨迹,可以实现从地表向地下油气藏的精准穿藏,最大化油气产量和采收率。200℃定向传感器作为随钻测量系统的核心感知器件,在深井、超深井以及复杂结…...
# 让工具自己声明并发安全:我把调度逻辑砍到一行
让工具自己声明并发安全:我把调度逻辑砍到一行 这是 《写完一个 AI 编程助手之后,我才确定 prompt 工程不是重点》 的第四篇。前几篇讲了进程模型和权限系统,这一篇讲并发调度。 代码:[https://github.com/sishenaichipingguo/cod…...
避坑指南:在ArcGIS中提取DEM高程点,为什么导入Global Mapper后看不到高度?
避坑指南:ArcGIS与Global Mapper高程数据互操作的核心陷阱与解决方案 当你第一次将精心处理的DEM高程点从ArcGIS导入Global Mapper,期待看到起伏有致的三维地形时,却发现所有点都"躺平"在二维平面上——这种挫败感我深有体会。这不…...
Linux内核同步机制:从原子操作到RCU的实战指南
1. 项目概述:为什么我们需要同步机制?想象一下,你正在一个繁忙的十字路口指挥交通。如果没有红绿灯和交通规则,车辆和行人随意穿行,结果必然是混乱、拥堵,甚至发生事故。在操作系统的核心——Linux内核中&a…...
在Node.js后端服务中集成Taotoken实现多模型异步调用的教程
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Node.js后端服务中集成Taotoken实现多模型异步调用的教程 对于需要在后端服务中调用大语言模型的Node.js开发者而言,…...
RT-Thread软定时器漂移问题深度解析与实战优化
1. 项目概述:从一次线上告警说起那天下午,系统监控平台突然弹出一连串的告警,核心业务模块的周期性任务执行间隔出现了肉眼可见的抖动,从预期的100毫秒,漂移到了130毫秒甚至更长。排查了一圈硬件、中断和任务调度&…...
构建企业级HTML到DOCX转换引擎:html-to-docx架构深度解析
构建企业级HTML到DOCX转换引擎:html-to-docx架构深度解析 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在现代企业文档处理流程中,将HTML内容转换为标准化的Word文档已成为刚…...
Python+AI智能体(Agent)零基础入门全攻略:原理、架构、手搓代码与实战落地
PythonAI智能体(Agent)零基础入门全攻略:原理、架构、手搓代码与实战落地 文章目录: 【前言】 一、前言:为什么现在必须学PythonAI Agent智能体二、核心概念:彻底搞懂什么是AI Agent智能体 2.1 官方工程定义2.2 普通大模型LLM V…...
