熱線電話:13121318867

登錄
首頁精彩閱讀學了協程之后,感覺有了無數個分身
學了協程之后,感覺有了無數個分身
2022-08-05
收藏

作者:小K

來源:麥叔編程

?

上次的關于進程、線程和協程的文章,很多粉絲留言表示想看協程的實際案例。

?

?

那么今天就來結合代碼實際講一個協程的實際應用。

在此之前,我希望大家能已經理解什么是串行、并行和并發的概念。如果你還不知道這三者的區別請前往Python三分鐘第131篇復習學習。

?

普通函數

定義一個洗衣服函數,洗衣服過程時間為2秒。

睡眠

import timedef wash_clothes(): time.sleep(2) # 洗衣服def run(): for i in range(20):  wash_clothes() print(f"衣服洗好了!當前時間:{time.time()}") if __name__ == '__main__': run()

運行結果:

衣服洗好了!當前時間:1659618457.003896衣服洗好了!當前時間:1659618459.005437衣服洗好了!當前時間:1659618461.0056782衣服洗好了!當前時間:1659618463.010311衣服洗好了!當前時間:1659618465.013951衣服洗好了!當前時間:1659618467.018253衣服洗好了!當前時間:1659618469.022136衣服洗好了!當前時間:1659618471.022881衣服洗好了!當前時間:1659618473.023118衣服洗好了!當前時間:1659618475.027102衣服洗好了!當前時間:1659618477.030786衣服洗好了!當前時間:1659618479.032495衣服洗好了!當前時間:1659618481.037195衣服洗好了!當前時間:1659618483.040722衣服洗好了!當前時間:1659618485.041149衣服洗好了!當前時間:1659618487.046405衣服洗好了!當前時間:1659618489.0484421衣服洗好了!當前時間:1659618491.050224衣服洗好了!當前時間:1659618493.055479衣服洗好了!當前時間:1659618495.0585659

我們可以看出,函數間隔2秒多一點點輸出一次時間。

協程函數

注意代碼中注釋

import timeimport asyncio# 異步函數定義需要在def前加async前綴async def wash_clothes():  # sleep也需要使用協程專用的模塊支持,同步的庫不能在異步中使用 asyncio.sleep(2) print(f"衣服洗好了!當前時間:{time.time()}")def run(): for i in range(20):    # 將協程函數注冊到loop(循環事件)中 loop.run_until_complete(wash_clothes())# 創建一個協程loop(循環事件)中loop = asyncio.get_event_loop()if __name__ =='__main__': run()

運行結果:

衣服洗好了!當前時間:1659619085.0939178衣服洗好了!當前時間:1659619085.094379衣服洗好了!當前時間:1659619085.095523衣服洗好了!當前時間:1659619085.095926衣服洗好了!當前時間:1659619085.097046衣服洗好了!當前時間:1659619085.0985332衣服洗好了!當前時間:1659619085.099058衣服洗好了!當前時間:1659619085.099848衣服洗好了!當前時間:1659619085.101115衣服洗好了!當前時間:1659619085.101917衣服洗好了!當前時間:1659619085.1026182衣服洗好了!當前時間:1659619085.103351衣服洗好了!當前時間:1659619085.1034582衣服洗好了!當前時間:1659619085.1035311衣服洗好了!當前時間:1659619085.1042402衣服洗好了!當前時間:1659619085.1052392衣服洗好了!當前時間:1659619085.106337衣服洗好了!當前時間:1659619085.106577衣服洗好了!當前時間:1659619085.107519衣服洗好了!當前時間:1659619085.108191

從運行結果看出,20桶衣服幾乎在同0.1秒內洗完了。

大致過程

  1. 定義協程函數;
  2. 創建協程循環事件;
  3. 將已定義的協程函數注冊到協程循環事件中;
  4. 啟動協程循環事件。

?

重點:協程函數內不能使用同步的函數或模塊,否則將不會被異步運行。

?

上一篇Python我提了協程執行的過程就像,“一個人啟動一臺洗衣機后,馬上去使用第二臺洗衣機,再第三臺...第四臺...第十臺”。

「當洗衣機啟動后的狀態就等于是掛起了」

然后協程馬上去啟動下一臺洗衣機...一直到結束。

后記

在某種意義上說,處理IO密集型任務協程的速度會高于多線程,因為線程的創建和銷毀需要消耗更多資源。

如果將這個大殺器用于網絡爬蟲,那不是速度要上天了?

是的,協程爬蟲超猛。以前親測比scrapy要快。

下期將從兩個話題中選出一個:

  1. 什么是IO密集型任務和計算密集型任務?
  2. 協程爬蟲
  3. 其他(寫上內容)

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢