简单了解python协程的相关知识
作者:北京_星空 时间:2021-04-12 19:37:54
什么是协程
协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个过程中保存和恢复cpu上下文那么程序还是可以运行的
通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的
协程和线程的差异
在实现多任务时,线程会自己欢子一些数据,操作系统切换时需要恢复数据,所以线程恢复比较耗性能
协程底层原理(举例)
'''
1,协程的实现原理,底层通过 yield 实现
'''
def work1(): #工作任务
for i in range(10):
print('work1----{}'.format(i))
yield i
def work2():
for i in range(10):
print('work2----{}'.format(i))
yield i
def work3():
for i in range(10):
print('work3----{}'.format(i))
yield i
g1 = work1()
g2 = work2()
g3 = work3()
while True: #循环调用生成器实现任务切换
try:
print(next(g1))
print(next(g2))
print(next(g3))
except StopIteration :
pass
break
协程 greenlet
python -m pip install greenlet
示例
'''
1,展示greenelent ,不能自动切换需要手动切换
'''
import greenlet
def work1():
for i in range(10):
print('work1----{}'.format(i))
g2.switch() #切换到g2
def work2():
for i in range(10):
print('work2----{}'.format(i))
g1.switch() #切换到g1
g1 = greenlet.greenlet(work1) #返回协程对象
g2 = greenlet.greenlet(work2)
g1.switch() #启动开关
执行顺序
gevent
greenlet 已经实现了协程,但是还是人工切换,gevent 提供了自动切换功能,其原理是执行过程中遇到IO操作,自动切换
'''
协程gevent IO操作会切换
'''
import gevent
def work1(): # 工作任务
for i in range(10):
print('work1----{}'.format(i))
gevent.sleep(0.5)
def work2():
for i in range(10):
print('work2----{}'.format(i))
gevent.sleep(0.5)
g1 = gevent.spawn(work1) #指定工作函数
g2 = gevent.spawn(work2) #指定工作函数
g1.join() #等待协程执行完成再往下走
g2.join()
来源:https://www.jianshu.com/p/3454cc999e04
标签:python,协程
0
投稿
猜你喜欢
让Python代码更快运行的5种方法
2023-08-25 08:35:15
document.all与WEB标准
2008-03-16 14:28:00
JS获取网页图片name属性的方法
2024-04-28 09:46:19
pytorch掉坑记录:model.eval的作用说明
2023-01-07 11:52:18
Python实现简易端口扫描器代码实例
2022-08-07 16:58:24
SQL Server 2005改进后的几个实用新特性
2008-05-07 19:16:00
详解flask入门模板引擎
2023-06-27 00:05:41
sql随机记录之如何解决每次RND的结果都一样的问题?
2007-09-11 13:24:00
python实现3D地图可视化
2023-08-27 10:24:50
mysql 8.0.22 安装配置方法图文教程
2024-01-24 20:30:05
Python获取Windows或Linux主机名称通用函数分享
2023-11-29 06:09:25
python中把嵌套的列表合并成一个列表方法总结
2022-06-07 04:11:22
python发送伪造的arp请求
2022-11-24 00:47:35
django在开发中取消外键约束的实现
2021-10-12 05:47:57
浅析JSON序列化与反序列化
2024-03-22 12:50:05
实操MySQL+PostgreSQL批量插入更新insertOrUpdate
2024-01-17 09:06:19
Python实现计算最小编辑距离
2021-07-16 19:26:18
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2024-06-05 09:15:26
基于torch.where和布尔索引的速度比较
2021-10-07 16:20:54
Go 一般方法与接口方法接收者的差异详解
2024-04-27 15:38:52