python多线程技术(Threading)

news2024/11/13 12:03:53

文章目录

  • 前言
  • 一、多线程(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 threading

def 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 time

def 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.coloradmin.cn/o/1612778.html

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

相关文章

MySql对于时间段交集的处理和通用实现方式(MyBatis-Plus)

问题:一般传统时间筛选是在[ 开始时间 → 结束时间 ]这个区间内的子集,也就是全包含查询方式,这种只会筛选一种情况。如果场景需要是开展一个活动,需要活动时间检索应该但凡包含就返回,也就是需要查询这个时间段有涉及…

Java的Hash算法及相应的Hmac算法

【相关知识】 加密算法知识相关博文:浅述.Net中的Hash算法(顺带对称、非对称算法)-CSDN博客 【出处与参考】 MessageDigest 类介绍、分多次调用update方法与一次性调用一致的说明引自: https://blog.csdn.net/cherry_chenr…

2024 IDM最新破解版及软件介绍

*IDM:信息时代的高效管理工具** 在快节奏的现代社会中,随着信息的爆炸式增长,如何高效、有序地管理信息成为每个人都需要面对的挑战。IDM,作为一种信息管理工具,正在逐渐受到人们的青睐。 IDM,全称Inform…

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程 📍相关篇《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》🎈《STM32 软件I2C方式读取MT6701磁编码器获取角度例程》📌MT6701当前最新文档资料:https://www.magntek.com.cn/u…

Scanpy(1)数据结构和样本过滤

注:主要讲述scanpy处理数据的结构、数据过滤(生信领域)和数据预处理(和机器学习类似,但是又有不同。) 1. Scanpy简介与安装 Scanpy 是一个可扩展的工具包,用于分析与 AnnData(一种…

git 小记

一、 github新建仓库 git clone 。。。。。。。。。。。 (增删查补,修改) git add . git commit -m "修改” git push (git push main) 二、branch 分支 branch并不难理解,你只要想像将代码拷贝到不同目录…

ruoyi-vue前端的一些自定义插件介绍

文章目录 自定义列表$tab对象打开页签关闭页签刷新页签 $modal对象提供成功、警告和错误等反馈信息(无需点击确认)提供成功、警告和错误等提示信息(类似于alert,需要点确认)提供成功、警告和错误等提示信息&#xff08…

restful请求风格的增删改查-----修改and删除

一、修改&#xff08;和添加类似&#xff09; 前端&#xff1a; <script type"text/javascript">function update(){//创建user对象var user {id:$("#id").val(),username:$("#username").val(),password:$("#password").val…

排序 “贰” 之选择排序

目录 ​编辑 1. 选择排序基本思想 2. 直接选择排序 2.1 实现步骤 2.2 代码示例 2.3 直接选择排序的特性总结 3. 堆排序 3.1 实现步骤 3.2 代码示例 3.3 堆排序的特性总结 1. 选择排序基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个…

又来!黄金主题LOF(161116)溢价40%开放申购,拖拉机都开冒烟了!

查看基金公告&#xff0c;黄金主题LOF(161116)下周一(4月22号)开放申购&#xff0c;限额100元&#xff0c;目前溢价40%&#xff0c;可以一拖七套利。 这熟悉的配方&#xff0c;这熟悉的套路&#xff01;一个月前的今天&#xff0c;我好像在标普500LOF上见过。又是易方达这个狗基…

数据结构_时间复杂度

✨✨所属专栏&#xff1a;数据结构✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 什么是时间复杂度&#xff1f; 时间复杂度的定义&#xff1a;在计算机科学中&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定量描述了该算法的运行时间。一个算法执行所耗费的时间&#xff0…

上位机图像处理和嵌入式模块部署(树莓派4b和类muduo网络编程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 既然是linux编程&#xff0c;那么自然少不了网络编程。在linux平台上面&#xff0c;有很多的网络编程库可以选择&#xff0c;大的有boost、qt&…

python3如何提取汉字

采用正则表达式的方法对字符串进行处理。 str1 "&#xff5b;我%$是&#xff0c;《速$.度\发》中 /国、人"&#xff08;1&#xff09;提取汉字 汉字的范围为”\u4e00-\u9fa5“&#xff0c;这个是用Unicode表示的。 import re res1 .join(re.findall([\u4e00-\u9fa…

如何对图片进行压缩和缩放

在手机像素越来越高的时代&#xff0c;照片的体积也在不断地膨胀&#xff0c;大部分情况下我们是不需要这么大的图片的&#xff0c;这个时候我们就需要对图片进行压缩或者缩放了&#xff0c;今天教大家如何缩小图片体积 打开智游剪辑&#xff08;官网: zyjj.cc&#xff09;&…

MySQL慢查询怎么办?需要关注Explain的哪些关键字?

目录 1-引言&#xff1a;什么是慢查询1-1 慢查询定义1-2 为什么排查慢查询 2-核心&#xff1a;慢查询排查2-1 慢查询定位2-2 慢查询解决2-2-1 Explain 排查慢查询2-2-2 Explain 重点关键字 3-总结&#xff1a;慢查询知识点小结 1-引言&#xff1a;什么是慢查询 1-1 慢查询定义…

LabelMe数据集格式问题

注意图片的通道数&#xff0c;之前我们都说RGB&#xff0c;但是在这里要看图片位深。 图像是rgba四个通道的&#xff0c;第四个通道是透明通道。 注意png格式的不只是文件名后缀是 .png &#xff0c;也可能是后缀名是 .jpg 但是图片里面的深度是为32的&#xff0c;常规的后缀是…

如何使用JSONB类型在PostgreSQL中存储和查询复杂的数据结构?

文章目录 解决方案1. 创建包含JSONB列的表2. 插入JSONB数据3. 查询JSONB数据4. 创建索引以优化查询性能 示例代码结论 在PostgreSQL中&#xff0c;JSONB是一种二进制格式的JSON数据类型&#xff0c;它允许你在数据库中存储和查询复杂的JSON数据结构。与普通的JSON类型相比&…

Matlab新手快速上手2(粒子群算法)

本文根据一个较为简单的粒子群算法框架详细分析粒子群算法的实现过程&#xff0c;对matlab新手友好&#xff0c;源码在文末给出。 粒子群算法简介 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种群体智能优化算法&#xff0c;灵感来源于…

flutter 实现表单的封装包含下拉框和输入框

一、表单封装组件实现效果 //表单组件 Widget buildFormWidget(List<InputModel> formList,{required GlobalKey<FormState> formKey}) {return Form(key: formKey,child: Column(children: formList.map((item) {return Column(crossAxisAlignment: CrossAxisAlig…

【BUG】Hexo|GET _MG_0001.JPG 404 (Not Found),hexo博客搭建过程图片路径正确却找不到图片

我的问题 我查了好多资料&#xff0c;结果原因是图片名称开头是_则该文件会被忽略。。。我注意到网上并没有提到这个问题&#xff0c;遂补了一下这篇博客并且汇总了我找到的所有解决办法。 具体检查方式&#xff1a; hexo生成一下静态资源&#xff1a; hexo g会发现这张图片…