Python实现协程的几种方法!这个非常有用!

Python协程的底层实现 生成器 协程的核心就是上下文切换,在Python中最简单的实现是用生成器 生成器有个方法 send() 可以从调用者向生成器函数发送数据,这样就可以在生成器中 yield future 表示要等待 future 的结果,然后把上下文切换到调用者,等 future 结果准备好后调用者再 send(future.result()) 给生成器发送结果,并把上下文切换到生成器函数 def gener... 阅读详情
AI摘要

本文详细介绍了Python中协程的实现方法,包括greenlet模块、yield关键字、asyncio装饰器以及async/await关键字的应用。通过实例演示了如何利用这些工具提升线程性能和异步编程能力。

异步化框架一部分

  • 异步非阻塞、asyncio
  • tornado、fastapi、django3.x asgi、aiohttp都在异步化 -->提升性能

协程详解

  • 协程不是计算机提供,程序员认为创造。
  • 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。
  • 简而言之:其实就是通过一个线程实现代码块相互切换执行。
  • 协程意义:在一个线程中如果遇到IO等待时间,线程不会傻傻等,利用空闲时间去干其他事实例: def fun1(): #如果按正常思路来执行的话 print(1) print(2) #程序会先执行fun1()、再次执行fun2() def fun2(): print(3) print(4) #(核心) #协程意思就是在fun1()和fun2()中来回切换的执行 fun1() #当然协程只有一个线程来完成这个事情 fun2() 输出结果为: 1 2 3 4 123456789101112131415

Python中实现协程的几种方法:

  • greenlet 这是一个第三方模块,也是一个早期的模块
  • yield 关键字实现
  • asyncio装饰器(py3.4版本以上)
  • async、await关键字(py3.5以上【推荐】)

通过greenlet实现协程

pip install greenlet -i https://pypi.doubanio.com/simple	--安装模块





from greenlet import greenlet								--导入模块

def fun1():													
    print(1)				-- 第二步: 输出 1
    gr2.switch()			-- 第三步:执行 gr2 (也就是func2函数)
    print(2)				-- 第六步:输出 2
    gr2.switch()			-- 第七步:执行 gr2 (也就是func2函数)

def fun2():
    print(3)				-- 第四步:输出 3
    gr1.switch()			-- 第五步:执行 gr1 (也就是fun1函数)
    print(4)				-- 第八步:输出 4
												
gr1 = greenlet(fun1)						
gr2 = greenlet(fun2)
gr1.switch()				-- 第一步:去执行 func1 函数
输出为:  1
		3
		2
		4
#如此执行,就实现了一个线程在函数中来回切换执行的方式.也就是协程
123456789101112131415161718192021222324252627

通过yield关键字实现协程

def fun1():
    yield 1
    yield from fun2()		-- 当调用fuc1()函数时,执行到这里,会执行fuc2函数 ↓
    yield 2					-- 等func2函数执行完毕,跳回刚才跳出的位置,继续执行fuc1

def fun2():
    yield 3
    yield 4

f1 = fun1()				或  #   f = fun1()		
for item in f1:				#   print(next(f))
    print(item)				#	print(next(f))
						    #	print(next(f))
输出为:1					    #	print(next(f))
	  3
	  4
	  2

#这种方式是伪造的协程,不推荐使用,但是也实现了协程的定义
12345678910111213141516171819

通过asyncio模块实现(python3.4版本之后的标准库)

import asyncio

@asyncio.coroutine					#打上这个装饰器,才能是协程函数
def fun1():
    print(1)
    yield from asyncio.sleep(2)    #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(2)

@asyncio.coroutine
def fun2():
    print(3)
    yield from asyncio.sleep(2)     #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(4)

tasks = [
     asyncio.ensure_future(fun1()),
     asyncio.ensure_future(fun2())		#列表中是来回切换的函数
 ]
loop = asyncio.get_event_loop()
loop.run_until_complete(fun1())

#注意遇到IO阻塞 自动切换(python3.5之后推荐使用关键字)
12345678910111213141516171819202122

async & await 关键字实现协程(Python3.5版本之后)

import asyncio

async def fun1():
    print(1)
    await asyncio.sleep(2)    #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(2)


async def fun2():
    print(3)
    await asyncio.sleep(2)     #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(4)

tasks = [
     asyncio.ensure_future(fun1()),
     asyncio.ensure_future(fun2())
 ]
loop = asyncio.get_event_loop()
loop.run_until_complete(fun1())
#注意遇到IO阻塞 自动切换

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

完整代码可以点击下方链接获取~

python免费学习资料以及群交流解答点击即可加入

 

Python协程与Go协程的实现差异分析 Python协程和Go协程的实现方式确实有很大差异,这主要是由于两种语言的设计理念、历史背景和目标用途不同。 阅读详情

相关推荐

202505系分论文《论软件系统测试方法及应用》

本文以软件测试方法为切入点,重点论述分层协作、智能赋能、全流程三个维度下传统测试与自动化测试的融合应用。

pccai的博客 1693

Python实现协程的几种方法

异步化框架一部分 异步非阻塞、asyncio tornado、fastapi、django3.x asgi、aiohttp都在异步化 -->提升性能 协程详解 协程不是计算机提供,程序员认为创造。 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。 简而言之:其实就是通过一个线程实现代码块相互切换执行。 实例: def fun1(): #如果按正常思路来执行的话 print(1) print(2) #程序会

weixin_44634704的博客 763

支付漏洞防护绕过的一种方式

放完包后就到了提交订单的地方,可以发现,金额确实小了很多,合理的搭配的话还可以更低,再次前进可以发现,金额确实是这么多,后面就不支付了,到此就结束了。也就是说数量可以为负数,但是金额不能为0或者0以下,有什么方法可以绕过这个限制吗,其实并不难,既然可以为负数,只是对金额不能为0或者负数做了限制。我们可以尝试拼接法,利用负数加上正数让他的值变得很低,但是又大于0就可以了,这里利用购物车的结算方法,随机加一些在购物车里。这里为了方便查看数据包,我这边商品的数量选择3,点击立即购买并抓包。

2301_80115097的博客 1529

Python协程

1.基本概念 1.阻塞/非阻塞 概念 定义 阻塞 程序未得到计算资源时被挂起的状态,在此期间程序无法处理其他事情 非阻塞 程序未得到计算资源时被挂起的状态,在此期间程序任然可以处理其他事情 2.同步/异步 概念 定义 场景 同步 不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,我们称这些程序单元是同步执行的 购物系统中更新商品库存,用行锁作为通信信号 异步 不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步

XiaoPawnYe的博客 3021

FSL软件安装

FSL软件安装

huang_tianyuan的博客 2631

别再手搓SVG了!用Vue3+SVG.js快速搭建电力系统拓扑图(附完整代码)

本文介绍了如何利用Vue3和SVG.js实现电力系统拓扑图的低代码开发,通过组件化和响应式数据绑定,大幅提升开发效率。文章详细解析了SVG.js的核心功能,包括图形创建链式API、动态属性绑定和高级图形操作,并提供了断路器组件的完整实现代码。此外,还分享了性能优化策略和调试技巧,帮助开发者应对大规模拓扑图的挑战。

weixin_27717759的博客 354

PyQt5之理解和使用Python中的qasync:连接Qt和asyncio的桥梁

qasync是一个Python库,它允许你在Qt的事件循环中使用asyncio。它提供了一种在Qt应用程序中运行asyncio协程的方法,使你能够在基于Qt的GUI应用程序中编写异步代码,而不会阻塞主事件循环。

载_酒i 2337

基于pytest+Allure+Python+CANoe的汽车诊断自动化测试框架搭建实战

自动化测试是提升软件质量和研发效率的关键技术,其核心原理是通过脚本模拟人工操作,实现测试用例的自动执行与结果验证。在汽车电子领域,诊断服务测试是确保车辆ECU(电子控制单元)功能正常的重要环节,传统手动测试在面对海量用例和频繁回归时效率低下。本文聚焦于如何利用Python的pytest测试框架、Allure报告工具以及Excel数据驱动,构建一个与Vector CANoe仿真测试环境深度集成的自动化测试解决方案。该方案通过Python调用CANoe的COM接口,实现了诊断报文的自动发送与响应验证,并结合Al

weixin_30384217的博客 680

协程的四种实现(基于python)

asyncio便会自动的执行其他任务,输出3;接着func2()阻塞2秒,func1()阻塞结束,打印2,解析:首先执行协程函数func1()(也可以说是任务1),输出1,这时人为进行阻塞2秒。也就是说asyncio能够在IO阻塞时自动的切换其他协程任务。func2()阻塞结束,打印4。

LHB123456789L的博客 275

【软件安装系列】Ubuntu+mysql5.7.27+Jira8.3.1+邮箱服务器配置+Confluence6.15.7安装经验和采坑总结

文章目录一、软件准备(百度云易被吞,就不放了)1.1 官网下载的新鲜的Jira和Confluence1.2 linux的jdk一份1.3 Jira和Confluence的破解程序或者破解包一份1.4 java的连接器一份二、安装过程1--java环境配置2.1 将下载下来的jdk包解压在/usr/local/java目录中2.2 写入环境变量三、安装过程2--mysql5.7.27环境配置3.1 ...

xiaosha_的博客 6894

Arduino读取串口接收到的数据并发送数据

Arduino读取串口接收到的数据并发送数据 源程序: void setup() { Serial.begin(115200); } void loop() { String comdata ; while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); } if (comdata.length() > 0) { Serial.print("串口接收到的数据:"); Serial.println(comd

perseverance51博客 1万+

python协程

1,多进程的理解 多线程和多进程都可以执行多个任务,线程是进程的一部分。线程的特点是线程直接可以可以共享内存和变量,资源消耗较少(Unix环境中,多进程和多线程资源消耗差距不是很大,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦 2,python多线程创建 在python中,同样可以实现多线程,有两个标准模块thread和threading,一般主要使用更加高级的threadi...

weixin_42337937的博客 344

OpenCV实现物体尺寸的测量

物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。

qq_53545309的博客 9161

python 协程实现

协程,又称微线程,纤程。英文名Coroutine。协程不是计算机提供的,是人为创造的上下文切换技术,也可以被称为微线程。简而言之 其实就是在一个线程中实现代码块相互切换执行。

cliffordl的专栏 1596

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python协程的四种实现方式

Python协程的四种实现方式

weixin_45005677的博客 3389

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python协程实现

协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。 python可以通过 yield/send 的方式实现协程。在python 3.5以后,async/await 成为了更好的替代方案。 async/await async/await关...

你的灯在亮 2868

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

python使用协程_python使用协程实现并发操作的方法详解

本文实例讲述了python使用协程实现并发操作的方法。分享给大家供大家参考,具体如下:协程协程是一种用户态的轻量级线程,又称微线程。协程拥有自己的寄存器上下文和栈,调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所...

weixin_35868872的博客 1745

python协程+异步实战!

实现了 __aiter__()和 __anext__()方法的对象。

墨城的博客 863

python协程批量处理文件_python使用协程实现并发操作的方法详解

python多进程+协程实现并发和异步io过程中,怎么去setInterval(函数名,1000); t: Timer = new Timer(1000, 5); t.addEventListener(TimerEvent.TIMER,函数名); t.addEventListener(TimerEvent.TIMER_COMPLETE, 函数名); t.start();再悲催的生活也不能阻止小编们...

weixin_39882394的博客 359

满满的干货!最全的介绍Python的协程是如何实现!看懂算你牛!

从广义上讲,协程是一种轻量级的并发模型,说的比较高大上。但从狭义上讲,协程就是调用一个可以暂停并切换的函数。像我们使用 async def 定义的就是一个协程函数,本质上也是个函数,而调用协程函数就会得到一个协程。将协程丢进事件循环,由事件循环驱动执行,一旦发生阻塞,便将执行权主动交给事件循环,事件循环再驱动其它协程执行。所以自始至终都只有一个线程,而协程只不过是我们参考线程的结构,在用户态模拟出来的。所以调用一个普通函数,会一直将内部的代码逻辑全部执行完;

2401_86168842的博客 828

python协程三种实现方法

协程的三种方法 1,协程中名词 event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数(协程)注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 future 对象: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装

kainystar的博客 1083

实现协程的方式及协程的意义 【笔记】

协程 协程不是计算机提供的,是程序员认为创造 协程也被称为微线程,是一种用户态的上下文切换技术,简而言之,就是通过一个线程实现代码互相切换执行 实现协程的几种方法: 1)greenlet,早期模块 2)yield关键字 3)asyncio装饰器 (python3.4以后引入的) 4)async,await关键字 (python3.5) 推荐 1.greenlet实现协程 greentlet是一个第三方模块,需要提前安装 pip3 install greenlet才能使用。 from greenlet

weixin_47906106的博客 5739

python协程实现异步_异步协程太吊了!以亲测!简直完美,Python异步协程的葵花宝典!...

进群:125240963 即可获取数十套PDF哦!阻塞状态指程序未得到所需计算资源时被挂起的状态。程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。常见的阻塞形式有:网络 I/O 阻塞、磁盘 I/O 阻塞、用户输入阻塞等。阻塞是无处不在的,包括 CPU 切换上下文时,所有的进程都无法真正干事情,它们也会被阻塞。如果是多核 CPU 则正在执行上下文切换操作的核不可...

weixin_39979332的博客 384

python协程的实现_Python 实现协程

协程的概念协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。(其实并没有说明白~)我觉得单说协程,比较抽象,如果对线程有一定了解的话,应该就比较好理解了。那么这么来理解协程比较容易:线程是系统级别的,它们是由操作系统调度;协程是程序级别的,由程序员根据需要自己调度。我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子...

weixin_39767513的博客 197
上一篇: Python有哪些神一般的骚操作? 远远不止抢车票、抢红包《附代码》
下一篇: 国庆长假已结束,Python 告诉你 6 亿国人都去哪儿浪了
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值