python多线程技术(Threading)

文章目录

  • 前言
  • 一、多线程(Threading)是什么?
  • 二、threading库
    • 1.初识多线程
    • 2.增加新线程
      • 2.1 多线程的基本使用
      • 2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)
      • 2.3 thread.join()功能
      • 2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那个例子怎么用多线程处理一个很大很大的数据(分成小数据集用多线程)的模板)
        • 示例1:输出不一定按顺序的草稿,不完整的模板
        • 示例2:有输出顺序的标准模板
      • 2.5 多线程的锁(lock)功能(保护共享内存的安全性)
        • 示例1:join功能在join前半段仍然是所有线程一起交替进行
        • 示例2:lock对象的使用
      • 2.6 python多线程的假多线程机制 ---- 假的多线程(通过不断切换线程,给一种多线程同时进行的假象)
  • 总结


前言

多线程技术可以帮助我们加速python的工作效率。看本文前建议先看python传参这篇文章,有一点小小的知识点需要知道才好理解lock功能哪里的维护共享内存的安全性。

一、多线程(Threading)是什么?

多线程是什么我也问过chatgpt,但是同样是给出了一种摸棱两可的官方语言,看不懂。这里就我个人的理解来讲讲什么是多线程。其实多线程用一个实际中的例子就很好理解了,假设现实中有一份工作,一个人做完成所花费的时间太长,作为老板的你受不了了,怎么办呢?请人,多找几个打工仔不就可以缩短了时间。这就是一个典型的多线程,每个打工仔就是一个线程。下面回到计算机中,有一份很大的数据,你嫌弃python处理的太慢了,于是你将这份很大的数据拆分成5个小数据,然后分配5个进程让python同时处理这5份小数据,理论上速度一下就提升了5倍。这就是多线程,简单理解就是让python在同一时间可以干多件事情。可以在同一个时间内运行多个程序,但是还是在同一个脚本中,这就是python多线程。
【注】:但是python里面多线程其实本质上是一个假的多线程,的确是在同一时间干多件事情,但是它是在不断的反复切换线程来实现的,所以从理论上来说速度是不会有加快的(应该是时间差不多,或者快一点)。但是同一个时间干多件事情这个功能还是要经常用到的,所以不要想着用python多线程加速了,能让你在同一时间干不同的事情已经够不错了。
如果需要加速需要使用多进程功能,后面博客里面会写,在这里加上链接。

二、threading库

下面演示怎么使用threading使用python多线程功能

1.初识多线程

function功能
threading.active_count()返回当前活动的线程数
threading.enumerate()返回当前活动的线程列表
threading.current_thread()返回当前线程对象
import threading
def main():print(threading.active_count())  # 返回当前活动的线程数print(threading.enumerate())     # 返回当前活动的线程列表print(threading.current_thread())   # 返回当前线程对象if __name__ == '__main__':main()

输出:
在这里插入图片描述
可以看到,目前显示有6个线程在运行中,其中画线的main就是我们mian函数运行的线程,并且可以看到当前正在运行的线程对象就是我们刚定义的main函数。线程对象列表里面其他几个线程不用管,应该是编辑器或者环境开启就有了的。
这么一看,我们可以将一个线程绑定一个python里面某个功能的主函数,那个这个线程就会干那个主函数干的活了。

2.增加新线程

可以看到上面main函数还是在一个脚本里面干一件事啊,如果要同时干第二件事怎么办,那就要添加新线程,并将其绑定到我们需要干的另一个主函数上,下面继续演示。

2.1 多线程的基本使用

import threading
def main():add_thread = threading.Thread(target=another_main, name='thread2')    # 创建线程,并于another_main函数绑定add_thread.start()  # 启动线程print(threading.active_count())  # 返回当前活动的线程数print(threading.enumerate())     # 返回当前活动的线程列表print(threading.current_thread())   # 返回当前线程对象def another_main():# 定义另一件事情print('-------another_main---------')while True:# while循环是为了让线程一直运行,不然线程会自动结束,便于观察线程的状态a=1 if __name__ == '__main__':main()      

输出:
在这里插入图片描述
可以看到输出了another_main干的事情,线程数由6变成了7,并且线程列表里面增加了名为thread2的新线程。
实现了在做main里面的事情的同时还在做another_main的事情。
【注】:这和在main里面直接调another_main不一样,直接调这两件事情是有一个先后顺序的,是在共用一个线程;但如果是another_main绑定上一个新线程,那么这两件事情就是平级关系,同时在干。

有没有发现上面演示的没有穿参数进去,如果要传参又应该怎么办呢!python里面传函数是不能带括号()的,似乎麻烦了。放心了,怎么可能开发者没有想到这一点呢,在给一个参数传参数不就可以了,嘿嘿!

import threadingdef main():# 创建线程并传递字符串和数字参数thread = threading.Thread(target=another_main, args=('Hello', 123))thread.start()print("Main thread is done!")def another_main(string_param, int_param):# 打印接收到的参数print("Received string parameter:", string_param)print("Received integer parameter:", int_param) if __name__ == '__main__':main()

输出:
在这里插入图片描述

2.2 对多线程是同时进行的进行一个直观上的演示(非重点–理解是实时就行)

上面由于another_main功能几乎是瞬时完成的,根本显示不出来这个同时性,反而像是直接调用打印一样。所以这里用time库进行一个直观上的演示。

import threading
import timedef main():# 创建线程并传递字符串和数字参数thread = threading.Thread(target=another_main)thread.start()print("Main thread is done!")def another_main():print('新thread started') # 打印线程开始for i in range(10):time.

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

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

相关文章

R version 4.1.0 安装ggplot2,options(pkgType=“binary“) install.packages(“ggplot2“)

R version 4.1.0 安装ggplot2 R version 4.1.0 安装ggplot21. 报错信息2. 成功安装3. 参考资料 R version 4.1.0 安装ggplot2 # 直接安装报错 install.packages("ggplot2")# 安装成功 options(pkgType"binary") install.packages("ggplot2")1. …

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

SpringBoot多数据源(一)

SpringBoot多数据源(一) 1.多数据源使用场景1.1 业务复杂(数据量大)1.2 读写分离 2.多数据源配置3.应用4.测试 1.多数据源使用场景 1.1 业务复杂(数据量大) 简单理解就是业务量复杂,将庞大的数…

Python模块之logging

官方文档 常见用法 logging模块是Python标准库中用于记录日志的模块。它提供了灵活且可配置的日志记录功能,可以用于在应用程序中捕获和输出各种级别的日志消息。以下是logging模块的常见用法示例: python import logging# 配置日志记录器 logging.b…

Java中的==与equals的区别

区别 首先,是运算符,equals()是方法 是一个二元运算符,用于比较两个对象的引用是否相同。当使用 进行比较时,Java会检查两个对象的内存地址是否相同。如果两个对象的内存地址相同,则认为它们是相同的。 如果比较的…

浏览器原理之本地存储

一 浏览器本地存储方式及使用场景 Cookies: 小段数据,由服务器发送到用户浏览器,浏览器将其存储并在以后的请求中回送到服务器。使用场景:会话管理(登录状态、用户偏好设置)、个性化(用户主题)、…

本地消息表模式保障分布式系统最终一致性

系统架构说明 状态转换说明 订单表消息表process_queue库存系统return_queue说明成功失败///订单库回滚成功成功失败//订单系统重发消息成功成功成功失败/Broker自动重试,注意接口幂等成功成功成功库存不足退回/Broker通知回掉,订单/消息作废成功成功成…

车轮上的智能:探索机器学习在汽车行业的应用前景

文章目录 引言:一、机器学习在汽车设计中的应用设计优化模拟与测试 二、智能制造与生产三、自动驾驶技术感知与决策数据融合 四、市场与模式的变革五、机器学习对于汽车行业的机遇与挑战挑战机遇 引言: 在当今数字化时代,机器学习作为人工智…

速盾:cdn可以加速哪些服务器

CDN(Content Delivery Network,内容分发网络)是一种通过将网站的静态资源部署到全球各地的服务器上,以提供更快速、更可靠的访问体验的技术。CDN可以加速许多类型的服务器,包括但不限于以下几种: 静态资源服…

全方位解析:深入了解Microsoft Edge浏览器的优势与特性

目录 1. 速度快: 2. 内存占用低: 3. 集成性好: 4. 支持Web标准: 5. 定制化选项: 6. 阅读模式和笔记功能: 7. 搜索引擎优化: 8. 扩展程序库: 9. 跨平台同步: 10…

android学习笔记(四)

1、ExampleInstrumentedTest的解读&#xff1a; /*** Instrumented test, which will execute on an Android device.** see <a href"http://d.android.com/tools/testing">Testing documentation</a>*/ RunWith(AndroidJUnit4.class) public class Exa…

Kafka -基本概念

认识Kafka kafka是一个多分区、多副本、基于zookeeper协调的分布式消息系统。 扮演角色 消息系统存储系统&#xff1a;把消息持久化到磁盘&#xff0c;相比于其他基于内存存储的系统而言&#xff0c;有效降低了数据丢失的风险。流式处理平台 基本概念 kafka的体系结构&…

Python爬虫-批量爬取Manner Coffee全国门店

前言 本文是该专栏的第25篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-批量爬取星巴克全国门店》里面有详细介绍采集全国门店的方法以及完整代码思路。对此领域感兴趣的同学,可以点击翻阅查看即可。 而在本文中,笔者将详细来介…

【离散数学】关系

一、序偶和笛卡尔积 序偶&#xff1a;两个元素按照一定的次序组成的二元组&#xff0c;记为<x,y>&#xff0c;x为第一元素&#xff0c;y为第二元素 序偶的相等条件&#xff1a;<a,b><c,d>当且仅当ac,bd n重有序组&#xff1a;n个元素按照一定次序组成的n元…

前端css中table表格的属性使用

前端css中table表格的属性使用 一、前言二、常见的表格属性1.边框的样式2.布局和对齐3.间距和填充4.背景和颜色5.字体的样式6.边框的圆角 三、简单的表格&#xff0c;例子11.源码12.源码1效果截图 四、给表格添加动画效果&#xff0c;例子21.源码22.源码2的运行效果 五、结语六…

kkFileView 任意文件上传致远程代码执行漏洞复现(QVD-2024-14703)

0x01 产品简介 kkFileView 是使用 spring boot 搭建的文件文档在线预览解决方案,支持主流办公文档的在线预览。 0x02 漏洞概述 2024年4月,互联网上披露kkFileView远程代码执行漏洞情报,攻击者可利用该漏洞上传恶意文件,获取操作系统权限。该漏洞利用简单,建议受影响的客…

大数据学习的第三天

文章目录 学习大数据命令的方式查看文件拷贝文件的方式添加数据的方式 出现了问题移动文件 hadoop工作流程和工作机制的方式namenodedatanodesecondarynamenode(主节点) 学习大数据命令的方式 查看文件 hadoop fs -cat /test/2.txt下载文件 hadoop fs -get -f /test/2.txt-f …

基于深度学习的脑部肿瘤检测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 当大脑中形成异常细胞时&#xff0c;就会发生脑肿瘤。肿瘤主要有两种类型&#xff1a;癌性&#xff08;恶性&#xff09;肿瘤和良性肿瘤。恶性肿瘤可分为原发性肿瘤和继发性肿瘤&#xff0c;前者始…

全国产化无风扇嵌入式车载电脑农耕车辆/钢厂天车行业应用

农耕车辆行业应用 背景介绍 当前农耕车车载电脑主要的功能&#xff0c;是要实现农耕车的精确的定位和导航&#xff0c;更加先进的系统则要实现农耕车自动驾驶&#xff0c;与农耕车上相关传感器的通讯(例如耕土深度的传感器, 油量存量传感器…)来实现更多的自动化、信息化的功能…

NASA数据集——TANSO-FTS 运行前 11 年收集的测量数据中得出二氧化碳(CO2)干空气摩尔分数(XCO2)的估计值

ACOS GOSAT/TANSO-FTS Level 2 bias-corrected XCO2 and other select fields from the full-physics retrieval aggregated as daily files V7.3 (ACOS_L2_Lite_FP) at GES DISC 简介 ACOS Lite 文件包含经过偏差校正的 XCO2 以及其他选定字段的每日汇总文件。ACOS 2 级标准…