什么是協(xié)程
協(xié)程是python種一種實現(xiàn)多任務的方式,他是一種比線程更加小的單元,占用更小的執(zhí)行單元(資源),為啥說他是一個執(zhí)行單元,因為他自帶CPU上下文,這樣在合適gr的時機,可以把一個協(xié)程切換到另一個協(xié)程,只要在這個過程中保存和恢復cpu上下文那么程序還是可以運行的
通俗的理解: 一個線程中的某個函數(shù),可以在任何地方保存當前函數(shù)的一些臨時變量,然后切換到另一個函數(shù)中運行,并且切換的次數(shù)以及社么時候再切換回來是可控的
協(xié)程和線程的差異
在實現(xiàn)多任務時,線程會自己歡子一些數(shù)據(jù),操作系統(tǒng)切換時需要恢復數(shù)據(jù),所以線程恢復比較耗性能
協(xié)程底層原理(舉例)
''' 1,協(xié)程的實現(xiàn)原理,底層通過 yield 實現(xiàn) ''' 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: #循環(huán)調用生成器實現(xiàn)任務切換 try: print(next(g1)) print(next(g2)) print(next(g3)) except StopIteration : pass break
協(xié)程 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) #返回協(xié)程對象 g2 = greenlet.greenlet(work2) g1.switch() #啟動開關
執(zhí)行順序
gevent
greenlet 已經(jīng)實現(xiàn)了協(xié)程,但是還是人工切換,gevent 提供了自動切換功能,其原理是執(zhí)行過程中遇到IO操作,自動切換
''' 協(xié)程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) #指定工作函數(shù) g2 = gevent.spawn(work2) #指定工作函數(shù) g1.join() #等待協(xié)程執(zhí)行完成再往下走 g2.join()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
