您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。