本文共 1805 字,大约阅读时间需要 6 分钟。
个人独立博客:
微信公众号:TechBoard协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字表示就是协程
协程也是实现多任务的一种方式
协程yield的代码实现
简单实现协程
import time# 定义协程def work1(): while True: print("work1...") time.sleep(1) yielddef work2(): while True: print("work2...") time.sleep(1) yieldif __name__ == '__main__': g1 = work1() g2 = work2() while True: next(g1) next(g2)
greenlet介绍:为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变得更加简单
首先使用pip安装greenlet模块:
pip3 install greenlet
greenlet的使用:
# greentlet的使用import greenletimport timedef work1(): for i in range(10): print("work1") time.sleep(1) g2.switch()def work2(): for i in range(10): print("work2") time.sleep(1) g1.switch()# 创建协程并指定任务g1 = greenlet.greenlet(work1)g2 = greenlet.greenlet(work2)if __name__ == '__main__': g1.switch()
实现协程的第三种方式:gevent
greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库——gevent
gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行
由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO
安装:
pip install gevent
# gevent的使用import gevent, timefrom gevent import monkey# gevent 遇到耗时操作(time, sleep, accept, recv, 网络请求)会切换到其他协程执行代码# 打补丁,让gevent 能够识别耗时操作monkey.patch_all()# 任务1def work1(): for i in range(10): print("work1") # gevent.sleep(1) time.sleep(1)def work2(): for i in range(10): print("work2") # gevent.sleep(1) time.sleep(1)if __name__ == '__main__': # 创建协程并指定执行的任务 g1 = gevent.spawn(work1) g2 = gevent.spawn(work2) # 让主线程等待协程执行完成以后程序再退出 g1.join() g2.join() # 注意点:如果程序一直运行,并且还有耗时操作,那么不需要使用join
个人独立博客:
微信公众号:TechBoard转载地址:http://sayqa.baihongyu.com/