Python10 python多线程

图片

1.什么是python多线程

Python的多线程指的是在一个Python程序中同时运行多个线程,以达到并发执行多个任务的目的。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

在Python中,多线程的实现通常依赖于内置的threading模块,这个模块允许用户创建和管理线程。使用多线程可以使得程序能够在等待某些事件(如输入/输出操作)完成时,继续执行其他任务,从而提高程序的整体效率和响应速度。

Python多线程的特点:
  • 全局解释器锁(GIL):Python的标准实现(CPython)中有一个称为全局解释器锁(GIL)的机制,它确保任何时候只有一个线程执行Python字节码。这意味着即便是在多核处理器上,使用多线程也不会带来线程真正并行执行的性能提升。因此,Python的多线程主要适用于处理I/O密集型任务,而不是计算密集型任务

  • 并发而非并行:由于GIL的存在,Python的多线程更多的是实现并发执行,而不是真正的并行执行。并发意味着任务在宏观上同时进行,但在任一时刻,实际上只有一个任务在单个CPU核心上运行。

  • 适用场景:Python多线程非常适合I/O密集型任务,比如网络交互、文件读写等,因为在这些操作中,线程的大部分时间都在等待外部事件完成,而CPU计算需求不高。

2.单线程

下面的示例代码展示了单线程执行的线性特性,即程序中的任务按照它们被调用的顺序依次执行。每个任务都必须等待前一个任务完成后才能开始执行。这种方式在处理涉及等待或延时的任务时可能不够高效,因为它不能同时进行多个任务。

代码示例:

from time import ctime,sleep  # 从time模块导入ctime和sleep函数,ctime用于获取当前时间并以易读的字符串形式返回,sleep用于使程序暂停执行指定的秒数
print('当前时间是:%s'%ctime())  # 打印当前的时间,%s是格式化字符串,用于在字符串中插入变量,这里插入的是ctime()函数返回的当前时间字符串# 单线程
from time import ctime,sleep
# 定义两个函数 music和movie用于模拟听音乐和看电影的活动
def music(what):# 在每个函数内部有一个for循环,循环两次,每次循环打印当前正在进行的活动及当前的时间,然后通过sleep(1)暂停1秒,模拟正在进行活动的时间消耗for i in range(2):print("我正在听音乐:%s,当前时间是:%s"%(what,ctime()))sleep(1)
def movie(what):for i in range(2):print("我正在看电影:%s,当前时间为:%s"%(what,ctime()))sleep(1)
music('你曾是少年')
movie('泰坦尼克号')
print('今天结束,当前时间为:%s'%ctime())

运行结果:

图片

3.多线程

下面的示例代码展示了如何使用Python的threading模块来创建和运行多线程程序,通过这种方式,可以同时执行多个任务。但是需要注意的是,由于设置了守护线程 (Daemon Threads),所以两个活动在主线程结束后也终止了,实际并没有按照设定的运行时间完成。守护线程表示当一个线程被设置为守护线程后,它就代表不重要的或在后台运行的服务。最重要的是,当所有非守护线程(即主线程)结束时,守护线程会被强制终止。

# 多线程
from time import ctime,sleep
import threadingdef music(what):for i in range(2):print("我正在听音乐:%s,当前时间是:%s"%(what,ctime()))sleep(2)
def movie(what):for i in range(2):print("我正在看电影:%s,当前时间为:%s"%(what,ctime()))sleep(5)
# 开启线程
# 创建一个空列表 threads,用于存储所有线程
# 创建两个线程对象 th1 和 th2,分别指定目标函数music和movie,以及传递给这些函数的参数
# 将创建的线程对象添加到threads列表中
threads=[]
th1=threading.Thread(target=music,args=('你曾是少年',))
threads.append(th1)
th2=threading.Thread(target=movie,args=('泰坦尼克号',))
threads.append(th2)# 执行线程
for th in threads:  # 循环遍历threads列表,启动每个线程th.daemon=True  # 使用setDaemon(True)将线程设置为守护线程。守护线程是一种在后台运行的线程,它的运行不会阻止主程序退出。当主程序退出时,守护线程会被自动终止。th.start()  # 使用start()方法启动线程
print('*****:听音乐和看电影结束{}'.format(ctime()))# 在多线程环境中,线程的执行顺序和完成时间是不确定的,依赖于操作系统的线程调度
# 在.py执行后,从执行结果来看,子线程(muisc 、move )和主线程(print('*****:听音乐和看电影结束{}'.format(ctime())))都是同一时间启动,但由于主线程执行完结束,所以导致子线程也终止

运行结果:

图片

可以通过阻塞主线程的方式 th.join() 来实现确保音乐和电影的活动能够完全完成。

# 多线程
from time import ctime,sleep
import threadingdef music(what):for i in range(2):print("我正在听音乐:%s,当前时间是:%s"%(what,ctime()))sleep(2)
def movie(what):for i in range(2):print("我正在看电影:%s,当前时间为:%s"%(what,ctime()))sleep(5)
# 开启线程
threads=[]
th1=threading.Thread(target=music,args=('丑八怪',))
threads.append(th1)
th2=threading.Thread(target=movie,args=('摔跤吧爸爸',))
threads.append(th2)# 执行线程
for th in threads:th.daemon=Trueth.start()
th.join()  # 阻塞主线程
print('*****:听音乐和看电影结束{}'.format(ctime()))

运行结果:

图片

4.单&多线程对比

import threading  # 导入threading包
from time import sleep
import timedef task1(): print ("Task 1 executed." )sleep(3)def task2():print ("Task 2 executed." )sleep(5)print("多线程:")
starttime=time.time();  # 记录开始时间
threads = []  # 创建一个线程列表,用于存放需要执行的子线程
t1 = threading.Thread(target=task1)  # 创建第一个子线程,子线程的任务是调用task1函数,注意函数名后不能有()
threads.append(t1)  # 将这个子线程添加到线程列表中
t2 = threading.Thread(target=task2)  # 创建第二个子线程
threads.append(t2)  # 将这个子线程添加到线程列表中for t in threads:  # 遍历线程列表t.daemon=True  # 将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起t.start() #启动子线程
for t in threads:  # 再次遍历线程列表t.join()  # 等待每个线程完成endtime=time.time()  # 记录程序结束时间
totaltime=endtime-starttime  # 计算程序执行耗时
print ("耗时:{0:.5f}秒" .format(totaltime))  # 格式输出耗时
print('---------------------------')# 以下为普通的单线程执行过程
print("单线程:")
starttime=time.time()
task1()
task2()
endtime=time.time()
totaltime=endtime-starttime
print ("耗时:{0:.5f}秒" .format(totaltime))
print('主线程')

运行结果:

图片

5.创建和管理定时任务

示例代码演示了如何在 Python 中使用 threading.Timer 类来创建和管理定时任务。threading.Timer 是线程模块中的一个功能,用于在指定的时间后执行一个函数,并且可以重复设置以周期性地执行。

import threading
import timedef fun_timer():  # 定义计时器函数print("hello timer")  # 每次调用计时器函数,打印hello timerglobal timertimer=threading.Timer(2.5,fun_timer)  # 创建一个新的 threading.Timer 对象。这个定时器被设置为 2.5 秒后再次执行 fun_timer 函数,实现定时任务的周期性执行timer.start()  # 启动定时器
timer=threading.Timer(1,fun_timer)  # 初始化一个定时器,设置为1秒后执行fun_timer函数,这是整个周期性执行的起点
timer.start()  # 激活定时器
time.sleep(15)  # time.sleep(15)会让主线程暂停15秒,期间fun_timer将被周期性地调用
timer.cancel()  # 停止定时器

运行结果:

图片

以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

昇思25天学习打卡营第1天 | 快速入门

内容介绍:通过MindSpore的API来快速实现一个简单的深度学习模型。 具体内容: 1. 导包 import mindspore from mindspore import nn from mindspore.dataset import vision, transforms from mindspore.dataset import MnistDataset 2. 处理数据 fro…

如何快速使用向量检索服务DashVector?

免费体验阿里云高性能向量检索服务:https://www.aliyun.com/product/ai/dashvector 本文将介绍如何快速上手使用向量检索服务DashVector。 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY:API-KEY管理。 已安装最新版SDK&#xff1a…

【网络安全学习】漏洞扫描:-01- 漏洞数据库searchsploit的使用

漏洞数据库是收集和存储各种软件漏洞信息的资源库。 漏洞数据库通常包含漏洞的名称、编号、描述、影响范围、危害等级、解决方案等信息,有些还提供漏洞的分析报告、演示视频、利用代码等内容。 1.常用的在线漏洞库: 国家信息安全漏洞共享平台 https:/…

Unity 天空盒制作使用教程

文章目录 1.概念2.制作天空盒3.使用天空盒3.1 为场景添加3.2 为相机添加 1.概念 天空盒是包裹整个场景的环境效果。 2.制作天空盒 1、创建材质球。 2、设置材质球Shader为SkyBox/6 Sided,将六张贴图放到对应位置。 3.使用天空盒 3.1 为场景添加 方法一、直接…

STM32F103ZET6_移植uC/OS_HAL

1下载源码 网址 GitHub - weston-embedded/uC-OS2: C/OS-II is a preemptive, highly portable, and scalable real-time kernels. Designed for ease of use on a huge number of CPU architectures. 需要下载三个文件 1看你使用是ucos2还是3(第一个文件&#…

【Python】类和对象高级特性

目录 前言 类变量与实例变量 类方法 静态方法 私有属性和方法 多重继承 元类 描述符 总结 前言 在前一篇文章中,我们讨论了 Python 类和对象的基本概念。本文将深入探讨一些高级特性,这些特性可以帮助你更有效地使用 Python 进行面向对象编程。…

Next.js开发中使用useRouter实现点击返回到上一页

在使用Next.js框架做前端页面开发时,如果想返回到上一页,可以利用useRouter钩子提供的back()方法,可以这样做: import {useRouter} from "next/navigation"; import {Space} from "antd"; import {ArrowLeftOutlined} f…

Mendix 创客访谈录|医疗设备领域的数字化转型利器

本期创客 尚衍亮 爱德亚(北京)医疗科技有限公司 应用开发和数字化事业部开发经理 大家好,我叫尚衍亮。毕业于软件工程专业,有6年的软件开发经验。从2021年开始,我在爱德亚(北京)医疗科技有限公司…

智能合约开发的过程

智能合约是一种运行在区块链上的程序,可以自动执行预先设定的条款和条件。智能合约具有去中心化、透明、不可篡改等特点,因此被广泛应用于金融、供应链、物联网等领域。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流…

Spring Boot集成Minio插件快速入门

1 Minio介绍 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小&…

LSM-Tree数据结构原理

LSM-Tree树原理 什么是LSM-Tree LSM-Tree 即 Log Structrued Merge Tree,这是一种分层有序,硬盘友好的数据结构。核心思想是利用磁盘顺序写性能远高于随机写。 LSM-Tree 并不是一种严格的树结构,而是一种内存磁盘的多层存储结构。HBase、L…

基于Baichuan2的新冠流感中医自我诊断治疗(大模型微调+Gradio)

一、项目说明 项目使用paddleNLP提供的大模型套件对Baichuan2-7b/13b进行微调,使用《中医治疗新冠流感支原体感染等有效病历集》进行Lora训练,使大模型具备使用中医方案诊断和治疗新冠、流感等上呼吸道感染的能力。 二、PaddleNLP PaddleNLP提供的飞桨…

css 文字两端对齐

<body><div class"box"><p>姓名</p><p>性与别</p><p>家庭住址</p><p>how are you</p><p>hello</p><p>1234</p><p>1 2 3 4</p></div> </body> text-a…

Ubuntu-24.04-live-server-amd64启用ssh

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu安装qemu-guest-agent Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、输入安装命令二、使用私钥登录&#xff08;可选&#xff09;1.创建私钥2.生成三个文件说明3.将公钥复制到服务器 三…

面向对象进阶--继承(Java继承(超详解))

目录 1. 继承 1.1 继承概述 1.2 继承特点 1.3练习 1.4继承父类的内容 构造方法是否被子类继承 成员变量是否被子类继承 成员方法是否被子类继承 1.5总结 继承中&#xff1a;成员变量的访问特点 继承中&#xff1a;成员方法的访问特点 方法重写概述 方法重写的本质 …

飞睿智能LR-WIFI无线数据采集模块,6公里视频图传,安防监控、工业传输数据更高效

在数字化浪潮席卷全球的今天&#xff0c;无线数据采集技术已经成为推动社会进步的重要力量。特别是在安防监控和工业领域&#xff0c;高效、稳定的数据传输成为了实现智能化、自动化的关键。飞睿智能LR-WiFi无线数据采集模块不仅具备可靠的传输性能&#xff0c;还能在复杂环境下…

尚硅谷爬虫学习第一天(3) 请求对象定制

#url的组成 #协议 http&#xff0c;https&#xff0c;一个安全&#xff0c;一个不安全。 #主机&#xff0c; 端口号 学过java 的肯定知道 沃日&#xff0c;以前面试运维的时候&#xff0c;问到主机地址&#xff0c;我懵逼了下&#xff0c;回了个8080 # 主机地址 80 # …

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…

Datacom HCIE实验考试通过率90%!深圳智汇云校传来5月捷报!

坚持不懈地努力&#xff0c;才能取得成功的果实 这是不变的真理 深圳云校传来5月捷报 在Datacom HCIE实验考试中 共有10名学员应战 其中9名学员凭借出色的表现 一次性通过了考试 展现出了扎实的技术能力 通过率高达90% &#xff08;华为历年考试平均通过率约60%&#…

超级棒的时钟屏保 芝麻时钟颜值高 屏保界的天花板

太酷了&#xff01;这个时钟屏保太有个性了 屏保时钟软件推荐&#xff01;超级棒的时钟屏保 芝麻时钟颜值高 屏保界的天花板&#xff0c;今天小编给大家分享一个非常实用好看的时钟屏保&#xff08;芝麻时钟&#xff09;&#xff0c;从美观、功能、效果、操作方面去评估&#x…