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 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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

永恒之蓝上线CS

该文介绍了在内网环境下,利用永恒之蓝漏洞(EternalBlue)将攻击者控制台(CS)上线的方法。前提条件是目标机器可上网、无防火墙和杀毒软件,并且存在永恒之蓝漏洞。使用Erebus插件的eterblue功能,通…

【Java框架】Spring框架(三)——Spring整合Mybatis及Spring声明式事务

目录 回顾Mybatis和新对象思路整理 Spring和MyBatis的整合步骤1. 创建Web工程,导入Spring和MyBatis的相关依赖2. 建立开发目录结构,创建实体类3. 创建数据访问接口和SQL映射语句文件4. 使用Spring配置文件配置数据源4.1 database.properties4.2spring配置…

第6章 Kafka-Eagle监控【Kafka】

第6章 Kafka-Eagle监控【Kafka】 前言推荐第6章 Kafka-Eagle监控6.1 MySQL环境准备6.2 Kafka环境准备6.3 Kafka-Eagle安装6.4 Kafka-Eagle页面操作 最后 前言 2024-3-27 22:44:15 本文是根据尚硅谷学习所做笔记 仅供学习交流使用,转载注明出处 推荐 【尚硅谷】…

纯干货|图像清晰度从哪里优化

1.Demosaic 调试Demosaic参数需要结合实验室静物高频细节需要插值出来如静物场景的视力表、星条卡和实验室灯箱环境下解析率卡的解析度指标满足要求。 Demosaic模块实现的功能就是将输入的Bayer数据转化成RGB数据。为获得彩色图像,需要利用当前像素及周围像素的色彩分…

计算机组成原理【CO】Ch7 I/O大题

目录 I/O大题解题方法 I/O接口 各种I/O方式的特点 I/O端口编址 程序查询方式 中断控制方式 DMA控制方式 程序中断的工作流程 程序中断的工作流程 DMA方式和中断方式的区别 I/O大题解题方法 CPU 程序查询中断DMA I/O接口的类型 按字传输:每次传输一个字 程…

ROS分布式通讯配置

4WD 必读:分布式通讯是相对于用虚拟机来连接小车上主机来说,如果是 4WD 笔记本无主 机用户,不存在分布式通讯一说。 1.4WD 用户单笔记设置一,连接底盘和雷达还有摄像头。 因为虚拟机带宽问题,无法保证摄像头正常运行。…

利用Django中的缓存系统提升Web应用性能

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在构建现代Web应用时,性能通常是至关重要的考虑因素之一。为了提高用户体验和应…

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

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

Ansys 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包,选择“解压到Ansys.2024.R1”。 打开解压后的文件夹,鼠标右击“ANSYS2024R1_WINX64_DISK1”选择“装载”。 鼠标右击“setup.exe”选择“以管理员身份运行”。  点击“安装ANSYS License Manger”。 点击“OK”。 点击”I …

【记录】Python3|Selenium 下载 PDF 不预览不弹窗(2024年)

版本: Chrome 124Python 3.12Selenium 4.19.0 版本与我有差异不要紧,只要别差异太大比如 Chrome 用 57 之前的版本了,就可以看本文。 如果你从前完全没使用过、没安装过Selenium,可以参考这篇博客《【记录】Python3|Se…

在PostgreSQL中如何有效地批量导入大量数据,并确保数据加载过程中的性能和稳定性?

文章目录 解决方案1. 使用COPY命令2. 调整配置参数3. 禁用索引和约束4. 使用事务5. 并发导入 总结 在PostgreSQL中,批量导入大量数据是一个常见的需求,特别是在数据迁移、数据仓库填充或大数据分析等场景中。为了确保数据加载过程中的性能和稳定性&#…

第62天:服务攻防-框架安全CVE 复现SpringStrutsLaravelThinkPHP

目录 思维导图 常见语言开发框架: 案例一:PHP-开发框架安全-Thinkphp&Laravel Thinkphp3.2.x日志泄露 自动化脚本检测 如何getshell 手工注入 ​ThinkPHP5 5.0.23 手工注入 工具检测 laravel-cve_2021_3129 案例二:JAVAWEB-开…

docker (CentOS,ubuntu)安装及常用命令

Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用 Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build&#xff…

AD设置覆铜与板子边缘间隔

1、设置板子边缘与覆铜间隔原因 在单个制板或者批量制板时,有时由于机器切割不稳定,造成切到覆铜,板子容易不稳定。为了保证机器切割不切到覆铜,我们可以设置覆铜到板子边缘的间隔。 2、设置方式 打开Design--->Rules&#…

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

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

JUC面试——⭐⭐Java中的四种引用类型/Threadlocal

四种引用类型 Java 中对象的引用分为四种级别,这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 基础知识 强引用:普通使用的引用 强引用是造成 Java 内存泄漏的主要原因之一 软引用: GC内存不够时回收 适用于&…

SpringBoot学习之Kafka下载安装和启动(三十三)

一、Mac环境 1、下载Kafka:Apache Kafka 2、这里我选择的版本是kafka_2.12-3.7.0,下载最新版的Kafka二进制文件,解压到你喜欢的目录(建议目录不要带中文)。 3、启动ZooKeeper服务,Kafka需要使用ZooKeeper&…

[linux]进程控制——进程等待

一、概念 进程等待,就是通过wait/waitpid的方式,让父进程(一般)对子进程进行资源回收的等待过程。 二、原因 (1) 当一个进程在退出的时候,如果不回收,就会变成僵尸状态&#xff0…

【C语言】——内存函数的使用及模拟实现

【C语言】——内存函数的使用及模拟实现 前言一、 m e m c p y memcpy memcpy 函数1.1、函数功能(1)函数名理解(2)函数介绍 1.2、函数的使用1.3、函数的模拟实现 二、 m e m m o v e memmove memmove 函数2.1、函数功能2.2、函数的…

Vulnhub靶机 DC-6 打靶实战 详细渗透测试过程

Vulnhub靶机 DC-6 详细渗透流程 打靶实战 目录 Vulnhub靶机 DC-6 详细渗透流程 打靶实战一、将靶机导入到虚拟机当中二、渗透测试主机发现端口扫描信息探测web渗透目录爆破爆破后台密码反弹shell搜集有价值信息SSH远程登录提权反弹jens用户权限的shell 提权利用 一、将靶机导入…