異步編程是并行編程的一種方式。單個工作單元獨立于主應用程序線程運行,并通知調用線程其完成、失敗情況或進度。下面這張圖理解起來會更直觀一些:
同步vs異步
同步編程很普遍。如圖,請求1被發出后等待響應1;一旦得到響應1就發出請求2,然后等待它的響應。在上面的代碼中,向函數傳遞參數“a”后等待函數返回更改后的值,然后再次調用以更改數字,最后再次得到響應,這就是同步編程。
而對于異步編程來說,請求1被發出后,無需等響應1便可直接發出請求2。兩個請求完成后得到兩個響應。簡單地說就是請求1和請求2是并行處理的,不等前一個請求的響應便提出新的請求。
簡言之,只要打開任務管理器(macOS中的活動監視器)就能看到多個應用程序同步運行;或者一個Python Shell在兩個不同的終端窗口中運行。專業術語叫做多進程(MultiProcessing),顧名思義,即不止一個進程在運行。
如何在Python中進行異步編程?
一個同步編程的示例代碼如下:
以上代碼的輸出:
這段代碼傳遞了for循環的范圍。執行代碼耗時長達13.843秒,因為r1的范圍是5000,所以耗時久。現在的問題是,必須先待r1任務完成,否則無法得到r2和r3。可能在得到r1之前就得到r2和r3嗎?答案是肯定的,這正是異步編程的用武之地。
首先用pip指令安裝異步包。
pip install asyncio
安裝后,看一下新代碼。使用異步包:
首先觀察該代碼的輸出,接下來討論該代碼:
輸出-1
輸出-2
輸出-1中首先能得到t2和t3進程的結果,然后在輸出-2的截圖中得到了t1進程的結果,這是異步編程的功勞。t1進程耗時最長,所以它的結果最后產生,且t1、t2和t3進程均并行運行。異步編程的好處就在于不必等待任何進程的結果,便可獲得下一個進程的結果。
讓我們討論一下此代碼。
首先,在if __name__==“__main__”中定義了asyncio.get_event_loop(),并將這個循環作為處理循環事件的異步對象。然后創建一個main的例行程序,并設置條件:若main沒完成則繼續循環。每次異步,都要進行loop.close()的編程,否則結果就會錯誤或異常。
然后將函數定義為asyncdeffunc_name,這樣解釋器就知道函數用了異步的方法。在main()中定義了三個任務(也可稱為子例程),并使用了await函數,以便它等待三個進程結束(即使它沒有多大意義,也必須使用它)。
最后用了fun()函數。i %10000的if條件讓最大范圍的進程徐徐運行,最后得到了答案。仔細研究fun()函數并自己嘗試的話,其中的邏輯會顯得非常合理和直接。
在Python中實現異步編程,你學會了嗎?
責編AJX
-
編程
+關注
關注
88文章
3614瀏覽量
93686 -
異步
+關注
關注
0文章
62瀏覽量
18043 -
python
+關注
關注
56文章
4792瀏覽量
84627
發布評論請先 登錄
相關推薦
評論