Python全系列 教程
3567个小节阅读:5931.9k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
Python中的协程经历了很长的一段发展历程。其大概经历了如下三个阶段:
yield/send
@asyncio.coroutine
和yield from
async/await
关键字【示例】不使用协程执行多个任务
xxxxxxxxxx
#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秒
'''
执行结果:
北京:第0次打印啦
北京:第1次打印啦
北京:第2次打印啦
上海:第0次打印了
上海:第1次打印了
上海:第2次打印了
耗时6.042387008666992
'''
【示例】使用yield协程,实现任务切换
xxxxxxxxxx
#coding=utf-8
import time
def func1():
for i in range(3):
print(f'北京:第{i}次打印啦')
yield # 只要方法包含了yield,就变成一个生成器
time.sleep(1)
def func2():
g = func1() #func1是一个生成器,func1()就不会直接调用,需要通过next()或for循环调用
print(type(g))
for k in range(3):
print(f'上海:第{k}次打印了' )
next(g) #继续执行func1的代码
time.sleep(1)
#有了yield,我们实现了两个任务的切换+保存状态
start_time = time.time()
func2()
end_time = time.time()
print(f"耗时{end_time-start_time}") #耗时5.0秒,效率差别不大
'''
执行结果:
上海:第0次打印了
北京:第0次打印啦
上海:第1次打印了
北京:第1次打印啦
上海:第2次打印了
北京:第2次打印啦
耗时5.039638996124268
'''
基于yield并发执行,多任务之间来回切换,这就是个简单的协程的体现,但是他能够节省I/O时间吗?不能。