協(xié)程

#?在不開辟線程的基礎上,執(zhí)行多任務(多個任務交替執(zhí)行的),又稱為微線程

# 一般來說,協(xié)程有三種方式,待我一一道來


1. 首先是yield關(guān)鍵字,在def里面看到y(tǒng)ield關(guān)鍵字可以理解是協(xié)程


yield協(xié)程

# 整體代碼較簡單,只需導入time包來進行耗時操作,剩下的靠代碼來操作!

——在每個def里的最后加入yield,然后在程序入口創(chuàng)建函數(shù)變量并且next()來執(zhí)行(利用死循環(huán))

——結(jié)果是兩個函數(shù)交替執(zhí)行,完成多任務


2. 再一個就是greenlet,事先檢查是否預裝該包(在命令行輸入pip3 list 查看)


greenlet

# 這個就有點不一樣;

1. 導入greenlet和time

2. 創(chuàng)建任務(先不管g1.switch和g2.switch)

3. 程序入口,創(chuàng)建協(xié)程指定對應的任務greenlet.greenlet()

先切換到第一個任務g1.switch(),然后回到函數(shù)在第一個任務下切換到第二個任務g2.switch()

緊接著在第二個函數(shù)下又切換到第一個任務!

4. 這樣就達到了多任務交替執(zhí)行的結(jié)果

# greenlet框架封裝的是yield,greenlet能夠讓程序員很直觀的查看協(xié)程的切換


3. 這一種也是用的最多的方式,利用gevent

gevrnt

#? gevent封裝是greenlet,可以根據(jù)耗時操作自動完成協(xié)程之間的切換執(zhí)行

# 這種方式可以說是最清新的(個人覺得)(笑臉)

# 和前面兩種不同的是,只要創(chuàng)建多個任務,然后就交給程序入口了,后期好維護!

# 說重點,程序入口創(chuàng)建協(xié)程指定的任務gevent.spawn()

——然后就不用管了,會自動執(zhí)行協(xié)程,嘿嘿嘿!

#那么問題就來了,運行結(jié)果是沒有任何數(shù)據(jù)輸出;

1. 那是因為主線程沒有等待協(xié)程執(zhí)行完就退出了,所以每個任務加入join()等待

2. 還有就是耗時操作,gevent只認自己的耗時gevrnt.sleep();

要想識別time,前期導入monkey模塊(在gevent里),然后打個補丁monkey.patch_all()就好了!


@總結(jié);方式多,但都很簡易,加油!

————來自江西九江的一紙黑字~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容