簡(jiǎn)單了解python協(xié)程的相關(guān)知識(shí)
什么是協(xié)程
協(xié)程是python種一種實(shí)現(xiàn)多任務(wù)的方式,他是一種比線程更加小的單元,占用更小的執(zhí)行單元(資源),為啥說他是一個(gè)執(zhí)行單元,因?yàn)樗詭PU上下文,這樣在合適gr的時(shí)機(jī),可以把一個(gè)協(xié)程切換到另一個(gè)協(xié)程,只要在這個(gè)過程中保存和恢復(fù)cpu上下文那么程序還是可以運(yùn)行的
通俗的理解: 一個(gè)線程中的某個(gè)函數(shù),可以在任何地方保存當(dāng)前函數(shù)的一些臨時(shí)變量,然后切換到另一個(gè)函數(shù)中運(yùn)行,并且切換的次數(shù)以及社么時(shí)候再切換回來是可控的
協(xié)程和線程的差異
在實(shí)現(xiàn)多任務(wù)時(shí),線程會(huì)自己歡子一些數(shù)據(jù),操作系統(tǒng)切換時(shí)需要恢復(fù)數(shù)據(jù),所以線程恢復(fù)比較耗性能
協(xié)程底層原理(舉例)
''' 1,協(xié)程的實(shí)現(xiàn)原理,底層通過 yield 實(shí)現(xiàn) ''' def work1(): #工作任務(wù) 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)調(diào)用生成器實(shí)現(xiàn)任務(wù)切換 try: print(next(g1)) print(next(g2)) print(next(g3)) except StopIteration : pass break
協(xié)程 greenlet
python -m pip install greenlet
示例
''' 1,展示greenelent ,不能自動(dòng)切換需要手動(dòng)切換 ''' 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é)程對(duì)象 g2 = greenlet.greenlet(work2) g1.switch() #啟動(dòng)開關(guān)
執(zhí)行順序
gevent
greenlet 已經(jīng)實(shí)現(xiàn)了協(xié)程,但是還是人工切換,gevent 提供了自動(dòng)切換功能,其原理是執(zhí)行過程中遇到IO操作,自動(dòng)切換
''' 協(xié)程gevent IO操作會(huì)切換 ''' import gevent def work1(): # 工作任務(wù) 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()
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python 協(xié)程 gevent原理與用法分析
- Python協(xié)程操作之gevent(yield阻塞,greenlet),協(xié)程實(shí)現(xiàn)多任務(wù)(有規(guī)律的交替協(xié)作執(zhí)行)用法詳解
- python 單線程和異步協(xié)程工作方式解析
- 關(guān)于Python核心框架tornado的異步協(xié)程的2種方法詳解
- python協(xié)程gevent案例 爬取斗魚圖片過程解析
- python多任務(wù)之協(xié)程的使用詳解
- python中的協(xié)程深入理解
- python已協(xié)程方式處理任務(wù)實(shí)現(xiàn)過程
相關(guān)文章
pytorch常用數(shù)據(jù)類型所占字節(jié)數(shù)對(duì)照表一覽
這篇文章主要介紹了pytorch常用數(shù)據(jù)類型所占字節(jié)數(shù)對(duì)照表一覽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python基于easygui實(shí)現(xiàn)pdf和word轉(zhuǎn)換小程序
這篇文章主要為大家詳細(xì)介紹了Python如何基于easygui實(shí)現(xiàn)pdf和word轉(zhuǎn)換小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04matplotlib之Font family [‘sans-serif‘] not&nbs
本文主要介紹了matplotlib之Font family [‘sans-serif‘] not found的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python3爬蟲中多線程進(jìn)行解鎖操作實(shí)例
在本篇文章里小編給大家整理了關(guān)于python3爬蟲中多線程進(jìn)行解鎖操作實(shí)例內(nèi)容,需要的朋友們可以參考下。2020-11-11Python中axis=0與axis=1指的方向有什么不同詳解
對(duì)數(shù)據(jù)進(jìn)行操作時(shí),經(jīng)常需要在橫軸方向或者數(shù)軸方向?qū)?shù)據(jù)進(jìn)行操作,這時(shí)需要設(shè)定參數(shù)axis的值,下面這篇文章主要給大家介紹了關(guān)于Python中axis=0與axis=1指的方向有什么不同的相關(guān)資料,需要的朋友可以參考下2024-01-01