異步編程是并行編程的一種方式。單個(gè)工作單元獨(dú)立于主應(yīng)用程序線程運(yùn)行,并通知調(diào)用線程其完成、失敗情況或進(jìn)度。下面這張圖理解起來(lái)會(huì)更直觀一些:
同步vs異步
同步編程很普遍。如圖,請(qǐng)求1被發(fā)出后等待響應(yīng)1;一旦得到響應(yīng)1就發(fā)出請(qǐng)求2,然后等待它的響應(yīng)。在上面的代碼中,向函數(shù)傳遞參數(shù)“a”后等待函數(shù)返回更改后的值,然后再次調(diào)用以更改數(shù)字,最后再次得到響應(yīng),這就是同步編程。
而對(duì)于異步編程來(lái)說(shuō),請(qǐng)求1被發(fā)出后,無(wú)需等響應(yīng)1便可直接發(fā)出請(qǐng)求2。兩個(gè)請(qǐng)求完成后得到兩個(gè)響應(yīng)。簡(jiǎn)單地說(shuō)就是請(qǐng)求1和請(qǐng)求2是并行處理的,不等前一個(gè)請(qǐng)求的響應(yīng)便提出新的請(qǐng)求。
簡(jiǎn)言之,只要打開(kāi)任務(wù)管理器(macOS中的活動(dòng)監(jiān)視器)就能看到多個(gè)應(yīng)用程序同步運(yùn)行;或者一個(gè)Python Shell在兩個(gè)不同的終端窗口中運(yùn)行。專業(yè)術(shù)語(yǔ)叫做多進(jìn)程(MultiProcessing),顧名思義,即不止一個(gè)進(jìn)程在運(yùn)行。
如何在Python中進(jìn)行異步編程?
一個(gè)同步編程的示例代碼如下:
以上代碼的輸出:
這段代碼傳遞了for循環(huán)的范圍。執(zhí)行代碼耗時(shí)長(zhǎng)達(dá)13.843秒,因?yàn)閞1的范圍是5000,所以耗時(shí)久。現(xiàn)在的問(wèn)題是,必須先待r1任務(wù)完成,否則無(wú)法得到r2和r3。可能在得到r1之前就得到r2和r3嗎?答案是肯定的,這正是異步編程的用武之地。
首先用pip指令安裝異步包。
pip install asyncio
安裝后,看一下新代碼。使用異步包:
首先觀察該代碼的輸出,接下來(lái)討論該代碼:
輸出-1
輸出-2
輸出-1中首先能得到t2和t3進(jìn)程的結(jié)果,然后在輸出-2的截圖中得到了t1進(jìn)程的結(jié)果,這是異步編程的功勞。t1進(jìn)程耗時(shí)最長(zhǎng),所以它的結(jié)果最后產(chǎn)生,且t1、t2和t3進(jìn)程均并行運(yùn)行。異步編程的好處就在于不必等待任何進(jìn)程的結(jié)果,便可獲得下一個(gè)進(jìn)程的結(jié)果。
讓我們討論一下此代碼。
首先,在if __name__==“__main__”中定義了asyncio.get_event_loop(),并將這個(gè)循環(huán)作為處理循環(huán)事件的異步對(duì)象。然后創(chuàng)建一個(gè)main的例行程序,并設(shè)置條件:若main沒(méi)完成則繼續(xù)循環(huán)。每次異步,都要進(jìn)行l(wèi)oop.close()的編程,否則結(jié)果就會(huì)錯(cuò)誤或異常。
然后將函數(shù)定義為asyncdeffunc_name,這樣解釋器就知道函數(shù)用了異步的方法。在main()中定義了三個(gè)任務(wù)(也可稱為子例程),并使用了await函數(shù),以便它等待三個(gè)進(jìn)程結(jié)束(即使它沒(méi)有多大意義,也必須使用它)。
最后用了fun()函數(shù)。i %10000的if條件讓最大范圍的進(jìn)程徐徐運(yùn)行,最后得到了答案。仔細(xì)研究fun()函數(shù)并自己嘗試的話,其中的邏輯會(huì)顯得非常合理和直接。
在Python中實(shí)現(xiàn)異步編程,你學(xué)會(huì)了嗎?
責(zé)編AJX
-
編程
+關(guān)注
關(guān)注
88文章
3628瀏覽量
93811 -
異步
+關(guān)注
關(guān)注
0文章
62瀏覽量
18070 -
python
+關(guān)注
關(guān)注
56文章
4799瀏覽量
84813
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
xilinx ISE 中異步FIFO ip的使用、仿真及各信號(hào)的討論(圖文教程)
Python編程語(yǔ)言可以應(yīng)用在哪些方面?
學(xué)python有哪些方向?
5種Python實(shí)現(xiàn)方式詳解
為什么用python在樹(shù)莓派上編程?詳解python的優(yōu)點(diǎn)
Python中的線性編程:直接教程分享
關(guān)于《Python編程入門系列教程》說(shuō)明及教程匯總
蟻群算法python編程實(shí)現(xiàn)
![蟻群算法<b class='flag-5'>python</b><b class='flag-5'>編程</b><b class='flag-5'>實(shí)現(xiàn)</b>](https://file.elecfans.com/web1/M00/45/B1/pIYBAFpz0yKAQfXCAAP-AFpuVcc969.png)
Python中的asyncio怎么樣使用
Python編程入門講解PPT
![<b class='flag-5'>Python</b><b class='flag-5'>編程</b>入門講解PPT](https://file.elecfans.com/web1/M00/C0/AD/pIYBAF8FMsGAb2iiAAGTxlEzxdY242.png)
蜂鳴器播放音樂(lè)設(shè)計(jì)與實(shí)現(xiàn)(附源碼)
![蜂鳴器播放音樂(lè)設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>(<b class='flag-5'>附</b><b class='flag-5'>源碼</b>)](https://file.elecfans.com/web1/M00/EC/AF/pIYBAGCDimiAJ2KzAAHcL1M_6Es895.png)
基于51單片機(jī)的圖書管理系統(tǒng)實(shí)現(xiàn)與設(shè)計(jì)(附源碼)
抽樣在Python中是如何實(shí)現(xiàn)的
怎么在Python中實(shí)現(xiàn)截圖功能
![怎么<b class='flag-5'>在</b><b class='flag-5'>Python</b><b class='flag-5'>中</b><b class='flag-5'>實(shí)現(xiàn)</b>截圖功能](https://file1.elecfans.com/web2/M00/AC/5A/wKgaomVEoMmAUc5vAAFd5e3tQb8906.jpg)
評(píng)論