Python10 python多线程

news2024/11/19 18:33:07

图片

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 threading

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

def 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=True
    th.start()
th.join()  # 阻塞主线程
print('*****:听音乐和看电影结束{}'.format(ctime()))

运行结果:

图片

4.单&多线程对比

import threading  # 导入threading包
from time import sleep
import time
 
def 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 time

def fun_timer():  # 定义计时器函数
    print("hello timer")  # 每次调用计时器函数,打印hello timer
    global timer
    timer=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.coloradmin.cn/o/1838366.html

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

相关文章

C# OCCT Winform 选中模型改变状态

选中状态设置 _context new AIS_InteractiveContext(_viewer);var selectionDrawer new Prs3d_Drawer();selectionDrawer.SetColor(Colors.Selection);selectionDrawer.SetDisplayMode(1);selectionDrawer.SetTransparency(0.1f);_context.SetSelectionStyle(selectionDrawe…

【机器学习】机器学习重要方法——无监督学习:理论、算法与实践

文章目录 引言第一章 无监督学习的基本概念1.1 什么是无监督学习1.2 无监督学习的主要任务 第二章 无监督学习的核心算法2.1 聚类算法2.1.1 K均值聚类2.1.2 层次聚类2.1.3 DBSCAN聚类 2.2 降维算法2.2.1 主成分分析(PCA)2.2.2 t-SNE 2.3 异常检测算法2.3…

【Gradio】Chatbot | 如何使用 Gradio Blocks 创建自定义聊天机器人

简介 重要提示:如果您刚开始接触,我们建议使用 gr.ChatInterface 来创建聊天机器人——它是一个高级抽象,使得可以快速创建漂亮的聊天机器人应用程序,往往只需一行代码。在这里了解更多信息。 本教程将展示如何使用 Gradio 的低级…

【网络安全】简单的免杀方法(非常详细)零基础入门到精通,收藏这一篇就够了_免杀加壳工具

目录 一、免杀的概念 二、免杀系统搭建 三、免杀工具介绍 1、myccl 2、C32asm 3、OD 4、LordPE 5、ImportREC 6、VC6.0/visual studio 7、数字签名 四、关于杀软排名不分前后 1、360。 2、金山毒霸 3、江民 4、瑞星 5、安天防线 6、卡巴斯基 7、NOD32 8、诺…

【日记】被客户一顿输出该怎么办(431 字)

正文 上午有个客户在电话里对着我一顿输出,说他们没有发票财务账务没法处理怎么怎么的。话里话外满满一股 “全是你们的错” 的味道。 当时我很想笑,大姐,你对我输出有啥用啊。票是上级行开的,我们又没有开票权限,对我…

openEuler23.09安装MySQL8.4.0

在openEuler-23.09上安装MySQL8.4.0 一、MySQL数据库服务环境搭建 操作系统版本 openEuler-23.09-x86_64-dvd.iso ,安装步骤此处省略。。。 MySQL8.4.0下载地址 https://dev.mysql.com/downloads/mysql/ 1.1、下载及上传mysql二进制安装包 上传mysql-8.4.0-linu…

游戏中插入音效

一、背景音乐 准备:素材音乐 方法: 1、方法1: (1) 将背景音乐 bgAudio 拖放到Hierarchy面板 (2) 选中 bgAudio,勾选开始运行就播放、循环播放。调节音量(volume) 2、方法2: (1) Create Empty&#x…

Zabbix自定义监控JAVA进程

一.定义脚本 二 .ZABBIX得agent允许以root身份执行 三. Zabbix测试自定item是否成功 四.ZABBIX服务端web添加新得item项 五.查看最新数据,取值成功

002.Linux CentOS7 安装

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

客户端输入网址后发生的全过程解析(协议交互、缓存、渲染)

目录 1. 输入 URL 并按下回车键2. DNS 解析3. TCP 连接4. 发送 HTTP 请求5. 服务器处理请求6. 发送 HTTP 响应7. 浏览器接收响应8. 渲染网页9. 执行脚本10. 处理其他资源11. TLS/SSL 加密(如果使用 HTTPS)握手过程 12. 协议协商和优化 总结 1. 输入 URL …

有关排序的算法

目录 选择法排序 冒泡法排序 qsort排序(快速排序) qsort排序整型 qsort排序结构体类型 排序是我们日常生活中比较常见的问题,这里我们来说叨几个排序的算法。 比如有一个一维数组 arr[8] {2,5,3,1,7,6,4,8},我们想要把它排成升序&#…

苹果将推出全新AI培训课程;生成式AI手机市场将迎来爆发式增长

🦉 AI新闻 🚀 苹果将推出全新AI培训课程 摘要:IT之家消息,苹果宣布,今年秋季将在6个国家的18所开发者学院推出AI培训课程,目标群体为学生、导师和校友。课程涵盖机器学习模型的构建及部署,Cor…

姜萍的启示:分数不是唯一,天赋引领专业选择超越名校

你好,我是三桥君。 24年高考帷幕落下,一场新的思考与选择悄然来临。 对于每一位高考考生,学校和专业都是开启大学新生活的两个前置必选项。 在这关键时刻,全网媒体却被一则关于“一名17岁中专女学生姜萍在全球数学竞赛获得第12名”…

数字孪生涉及到的9大技术栈,都是难啃骨头呀。

数字孪生涉及到多个技术栈,包括但不限于以下几个方面: 数据采集和传感器技术: 数字孪生需要实时获取物理世界的数据,因此需要使用各种传感器技术(如温度传感器、压力传感器、运动传感器等)来采集数据&…

排序(3)【归并排序】【计数排序】【排序算法度及其稳定性分析】

一.归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有…

C++ 66 之 类模版

#include <iostream> #include <string> using namespace std;// 习惯性 < >中 类模板用class 普通的函数模板就用typename // template<class NAMETYPE, class AGETYPE> template<class NAMETYPE, class AGETYPE int> // 可以设置默认的类型值…

集团门户网站的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;集团文化管理&#xff0c;基础数据管理&#xff0c;公告通知管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xff0…

收银系统源码-千呼新零售2.0【线下促销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

在LangChain中,LLM(大型语言模型)和LLM Chain的区别是什么?

简单来说&#xff0c;LLM是一个大型语言模型&#xff0c;而LLM Chain是由多个LLM或其他组件组成的链式结构&#xff0c;用于在LangChain中构建复杂的自然语言处理流程。 Direct LLM Interface: 直接大型语言模型&#xff08;LLM&#xff09;接口&#xff1a; llm Open…

【NOI-题解】1234. 任意输入一正整数N,要求把它拆成质因子的乘积。1446. 人口增长问题

文章目录 一、前言二、问题问题&#xff1a;1234. 任意输入一正整数N&#xff0c;要求把它拆成质因子的乘积。问题&#xff1a;1446. 人口增长问题 三、感谢 一、前言 本章节主要对循环应用的题目进行讲解&#xff0c;包括《1234. 任意输入一正整数N&#xff0c;要求把它拆成质…