Python 网络与并发编程(四)

news2024/10/6 20:34:00

文章目录

  • 协程Coroutines
    • 协程的核心(控制流的让出和恢复)
    • 协程和多线程比较
    • 协程的优点
    • 协程的缺点
  • asyncio实现协程(重点)

协程Coroutines

协程,全称是“协同程序”,用来实现任务协作。是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理。
当出现IO阻塞时,CPU一直等待IO返回,处于空转状态。这时候用协程,可以执行其他任务。当IO返回结果后,再回来处理数据。充分利用了IO等待的时间,提高了效率。

协程的核心(控制流的让出和恢复)

1每个协程有自己的执行栈,可以保存自己的执行现场
2 可以由用户程序按需创建协程(比如:遇到io操作),协程“主动让出(yield)”执行权时候,会保存执行现场(保存中断时的寄存器上下文和栈),然后切换到其他协程
3 协程恢复执行(resume)时,根据之前保存的执行现场恢复到中断前的状态,继续执行,这样就通过协程实现了轻量的由用户态调度的多任务模型

协程和多线程比较

比如,有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。
在这里插入图片描述
1 在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。

2 多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。

3 协程版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。

协程的优点

1 由于自身带有上下文和栈,无需线程上下文切换的开销,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级;
2 无需原子操作的锁定及同步的开销;
3 方便切换控制流,简化编程模型
4 单线程内就可以实现并发的效果,最大限度地利用cpu,且可扩展性高,成本低(注:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理)

asyncio协程是写爬虫比较好的方式。比多线程和多进程都好开辟新的线程和进程是非常耗时的

协程的缺点

1 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上。

2 当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。

asyncio实现协程(重点)

1 正常的函数执行时是不会中断的,所以你要写一个能够中断的函数,就需要加 asyncasync 用来声明一个函数为异步函数,异步函数的特点是能在函数执行过程中挂起,去执行其他异步函数,等到挂起条件(假设挂起条件是sleep(5) )消失后,也就是5秒到了再回来执行
2 await 用来用来声明程序挂起,比如异步程序执行到某一步时需要等待的时间很长,就将此挂
起,去执行其他的异步程序。
3 asyncio 是python3.5之后的协程模块,是python实现并发重要的包,这个包使用事件循环驱动实现并发。

不使用协程,耗时6秒

#coding=utf-8
import time
def func1():
	for i in range(3):
		print(f'北京:第{i}次打印啦')
		time.sleep(1)
	return "func1执行完毕"
def func2():
	for k in range(3):
		print(f'上海:第{k}次打印了')
		time.sleep(1)
	return "func2执行完毕"
def main():
	func1()
	func2()
if __name__ == '__main__':
	start_time = time.time()
	main()
	end_time = time.time()
	print(f"耗时{end_time-start_time}") #不使用协程,耗时6秒


使用协程,耗时3秒

#coding=utf-8
import asyncio
import time
async def func1(): #async表示方法是异步的
	for i in range(3):
		print(f'北京:第{i}次打印啦')
		await asyncio.sleep(1)
	return "func1执行完毕"
async def func2():
	for k in range(3):
		print(f'上海:第{k}次打印了' )
		await asyncio.sleep(1)
	return "func2执行完毕"
async def main():
	res = await asyncio.gather(func1(),func2())
	#await异步执行func1方法
	#返回值为函数的返回值列表,本例为["func1执行完毕", "func2执行完毕"]
	print(res)
if __name__ == '__main__':
	start_time = time.time()
	asyncio.run(main())
	end_time = time.time()
	print(f"耗时{end_time-start_time}") #耗时3秒,效率极大提高

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

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

相关文章

走进电线电缆行业龙头金杯电工,助推湖南“智赋万企”行动热潮

湖南省政府推动的“智赋万企”行动掀起千行百业万企的数智化浪潮,在企业、服务商、行业协会等多方共推下,湖南省的数字化生态越发繁荣。 4月23日,纷享销客举办的【走进数字化游学示范基地之金杯电工】活动在长沙顺利举行。本期活动走进电线电…

ThingsBoard远程RPC调用设备

使用 RPC 功能 客户端 RPC 从设备发送客户端 RPC 平台处理客户端RPC 服务器端 RPC 服务器端RPC结构 发送服务器端RPC 使用 RPC 功能 ThingsBoard 允许您从服务器端应用程序向设备发送远程过程调用 (RPC),反之亦然。基本上,此功能允许您向设备发送命…

vue2项目升级到vue3经历分享1

依据vue官方文档,vue2在2023年12月31日终止维护。因此决定将原来的岁月云记账升级到vue3,预计工作量有点大,于是想着把过程记录下来。 原系统使用的技术栈 "dependencies": {"axios": "^0.21.1","babel-…

Qt配置CMake出错

一个项目需要在mingw环境下编译Opencv源码,当我用Qt配置opencv的CMakeLists.txt时,出现了以下配置错误: 首先我根据下述博文介绍,手动配置了CMake,但仍不能解决问题。 Qt(MinGW版本)安装 - 夕西行 - 博客园 (cnblogs.…

数之寻软件怎么样?

数之寻软件是一款功能强大的数据恢复和备份软件,以下是对其特点和功能的详细评价: 一、数据恢复方面: 高效的数据恢复能力:数之寻软件采用了先进的算法和数据恢复技术,能够快速有效地恢复丢失或损坏的数据。无论是文…

laravel视频对接aws

本次对接文件上传,目标是实现超级大文件的上传任务,可能就是4~5个g的视频文件,折腾了蛮久熟悉s3,因此记录一下。 大家要是对filesystem不清楚去看一下官方文档不然可能有点懵逼。 首先我先是对接了一个普通的s3存储文件的功能&a…

[解决] 为什么 App Inventor 扩展导入了,但是没啥反应?

大概率是导入拓展后,没有拖动拓展到界面上! 导入拓展后,别忘了拖动拓展到主界面上,这样才算真正创建了拓展对象,这时才能使用拓展的方法。 原文:为什么 App Inventor 扩展导入了,但是没啥反应&…

了解Cookie登录:原理、实践与安全指南

什么是Cookie登录? Cookie是什么 当你首次登录网站时,你会输入用户名和密码。在后台,网站的服务器验证这些凭据是否正确。一旦确认你的身份无误,服务器就会创建一个Cookie,并将其发送到你的浏览器。这了解Cookie登录…

量子+AI,实用还需多久?

生成式人工智能正在席卷全球。OpenAI的GPT-4能够通过律师资格考试,Midjourney的图像作品能够赢得艺术大奖,而Sora则能够根据文本创造出令人难以置信的逼真视频。 这些AI模型的成就预示着通用人工智能的曙光——一个曾经只存在于科幻小说中的概念。然而&a…

快速了解网站访问为什么提示存在安全隐患,该怎么解决

这通常是由于网站使用了不安全的HTTP协议进行通信,或者网站的SSL证书存在问题,或者网站被标记为危险,或者网页中混杂了非HTTPS的内容。 网站访问提示不安全通常是由于以下原因之一引起的,可以按照相应的解决方案进行排查和解决&…

Java集合相关的List、Set、Map基础知识

目录 一、集合介绍 二、List 三、Map HashMap的数据结构 如何理解红黑树 四、set 一、集合介绍 在Java中,集合是一种用于存储对象的数据结构,它提供了一种更加灵活和强大的方式来处理和操作数据。Java集合框架提供了一系列接口和类,用…

CyberData统一元数据服务

CyberData统一元数据服务功能完善,实现了湖仓平台元数据在整个平台的统一管理以及外部数据源元数据的主动发现和多计算引擎间元数据的互通互联。 同时,我们支持跨多元计算场景,以及在元数据基础上的统一数据权限管理和数据湖的自动化优化加速…

2024年好用又便宜的云手机!哪款性价比高?

随着科技的飞速发展,云计算技术也在不断演进,而云手机作为其创新之一,已经开始在我们的生活中崭露头角。它通过将手机的硬件和软件功能移到云端,让用户能够借助强大的云计算资源完成各种任务。2024年,哪款云手机性价比…

springboot整合rabbitMQ系列10 利用插件实现延时消息

插件的安装,本文就不做描述了,插件安装后如下,就说明安装成功了1 添加pom依赖,yml配置就不讲了2 核心类,定义交换机的代码改成如下,其它的定义队列,设置绑定关系,设置死信等&#xf…

WebStorm 2024 for Mac:前端开发的强大助手

WebStorm 2024 for Mac是一款专为前端开发者设计的集成开发环境(IDE),以其强大的功能和出色的性能,为Mac平台上的开发者提供了高效、便捷的Web开发体验。 WebStorm 2024 for Mac v2024.1.1中文激活版下载 这款IDE支持多种编程语言…

深入理解GTK、Qt、AWTK:跨平台GUI框架对比

目录标题 GTK特性:优点:缺点: Qt特性:优点:缺点: AWTK特性:优点:缺点: 适用场景 在当今的软件开发领域,图形用户界面(GUI)的开发是不可…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述,这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式(UiAbility),样式的书写、状态管理以及动画等方面进行探讨 页面之间…

文件权限管理

文件权限管理 1. 权限对象 权限对象含义u属主,所有者g属组o其他人 2. 权限类型 权限类型含义值r读权限4w写权限2x执行权限1 3. 修改文件属主及属组 命令:chown(change own)更改文件或目录属主与属组名 3.1 修改文件属主与属组 只修改属主:chown $…

交互式探索微生物群落与生态功能的关系

微生物群落在生态系统中发挥则重要功能,我们在对微生物群落进行分析时,会将不同分类水平(从门到属)的微生物类群的相对丰度与测定的某一生态功能进行相关性分析。但由于微生物类群数较多,又有不同的分类水平&#xff0…

python利用tg机器人推送发消息从安装到使用(二)

上一篇请参考: python利用tg机器人推送发消息从安装到使用-CSDN博客 本篇主要针对第二种方式推送tg消息,也就是使用telegram库的Bot发送消息,不仅可以发送文本,还可以方便的发送超链接内容和图片。 不过,随着telegram库的升级等各种原因,目前网上很多代码都不能直接使…