这篇文章将为大家详细讲解有关python协程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
什么是协程
协程是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()
关于“python协程的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。