实现协程的三种方式

协程

协程,简而言之,就是通过一个线程实现代码块相互切换执行。

协程的意义:在一个线程中如果遇到IO等待时间,线程不会傻傻等,利用空闲时间再去干点其他事

实现协程的几种方法:

1.yield关键字

2.asyncio装饰器(3.4版本)

3.async,await关键字(3.5版本后,推荐使用)

1.yield关键字
python 复制代码
def func1():
	yield 1;
	yield from func2() #跳到func2函数里面
	yield 2
def func2():
	yield 3
	yield 4
f1=func1()
for item in f1:#每次循环,执行里面的yield
	print(item)

如果一个函数里面有yield关键字,我们就认为是生成器函数,只要执行函数,返回的就是生成器

但是在真正实现协程,我们不会用这种方式,这里了解即可。

2.asyncio装饰器(3.4版本)
python 复制代码
import asyncio
@asyncio.coroutine
def func1():
	print(1)
	yield from asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务
	print(2)
@asyncio.coroutine
def func2():
	print(3)
	yield from asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务
	print(4)
tasks=[asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

asyncio模块的特别之处在于遇到了yield from后面的IO操作,它不会傻傻地等,它会切换任务

实际应用:比如我要下载很多图片,在发送下载一张图片的请求后等待响应的时候,线程可以继续发送其它下载图片的请求,这时就可以节省很多时间

3.async,await关键字(3.5版本后,推荐使用)
python 复制代码
import asyncio

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

async def func2():
	print(3)
	await asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务
	print(4)
tasks=[asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

这个完成的功能和asyncio装饰器其实是一样的,本质上就是把装饰器和yield from换成async 和 await,更加方便使用而已

相关推荐
Hi_Amos7 分钟前
记一次 yfinance 源码调试:SOCKS5 代理下 Chart API 正常,历史数据却一直超时
python·k线·yfinance
练习时长两年半的RL练习生22 分钟前
与AI对话后对 Actor-Critic 中 TD Target 的 a‘ 来源总结
开发语言·人工智能·php
青少儿编程课堂25 分钟前
用图形化编程做一个“少年探险闯关”小游戏:方向键控制、碰撞检测与多关卡串起完整项目
c++·python·算法·bfs·信息学竞赛
evans在进步44 分钟前
Spring Boot 工程化核心详解:Parent、Starter、热部署、事务与多数据源
spring boot·后端·python
十五年专注C++开发1 小时前
100w条数据丝滑滚动!Qt Model/View 架构实战(二)
开发语言·c++·qt
萧瑟余晖1 小时前
Java深入解析篇三十九之集成测试
java·开发语言·集成测试
skr爱码士1 小时前
06_Qt 常用数据类型与容器:QString、QList、QVector、QMap 的性能与实现分析
开发语言·c++·qt
战略性的菠萝1 小时前
学习笔记-Numpy知识
python·numpy
总有刁民想爱朕ha1 小时前
零基础Python开发「图片批量转MP4视频」工具,本地离线、免费无水印
开发语言·python·音视频
l1t1 小时前
测试DuckDB luajit插件读取本地通达信文件
开发语言·数据库·duckdb