日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在Python中實現(xiàn)異步編程,只需要這幾步就夠了

   [[348195]]

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)紅塔,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

圖源:unsplash

異步編程是并行編程的一種方式。單個工作單元獨立于主應(yīng)用程序線程運行,并通知調(diào)用線程其完成、失敗情況或進度。下面這張圖理解起來會更直觀一些:

同步vs異步

同步編程很普遍。如圖,請求1被發(fā)出后等待響應(yīng)1;一旦得到響應(yīng)1就發(fā)出請求2,然后等待它的響應(yīng)。在上面的代碼中,向函數(shù)傳遞參數(shù)“a”后等待函數(shù)返回更改后的值,然后再次調(diào)用以更改數(shù)字,最后再次得到響應(yīng),這就是同步編程。

而對于異步編程來說,請求1被發(fā)出后,無需等響應(yīng)1便可直接發(fā)出請求2。兩個請求完成后得到兩個響應(yīng)。簡單地說就是請求1和請求2是并行處理的,不等前一個請求的響應(yīng)便提出新的請求。

簡言之,只要打開任務(wù)管理器(macOS中的活動監(jiān)視器)就能看到多個應(yīng)用程序同步運行;或者一個Python Shell在兩個不同的終端窗口中運行。專業(yè)術(shù)語叫做多進程(MultiProcessing),顧名思義,即不止一個進程在運行。

如何在Python中進行異步編程?

一個同步編程的示例代碼如下:

 
 
 
  1. deffun(length,a): 
  2.                   b = a 
  3.                   for i inrange(length): 
  4.                       a+=1 
  5.                   print("value of a before: "+str(b)+" now it's "+str(a)) 
  6.                   return a 
  7.                   
  8.               defmain(): 
  9.                   r1 =fun(50000000,0) 
  10.                   r2 =fun(100,12) 
  11.                   r3 =fun(100,41) 
  12.               if __name__=="__main__": 
  13.                   main() 

以上代碼的輸出:

這段代碼傳遞了for循環(huán)的范圍。執(zhí)行代碼耗時長達13.843秒,因為r1的范圍是5000,所以耗時久?,F(xiàn)在的問題是,必須先待r1任務(wù)完成,否則無法得到r2和r3??赡茉诘玫絩1之前就得到r2和r3嗎?答案是肯定的,這正是異步編程的用武之地。

首先用pip指令安裝異步包。

 
 
 
  1. pip install asyncio 

安裝后,看一下新代碼。使用異步包:

 
 
 
  1. import asyncio 
  2.            asyncdeffun(length,a): 
  3.            b = a 
  4.            for i inrange(length): 
  5.                a+=1 
  6.                if i %10000==0: 
  7.                    await asyncio.sleep(0.0001) 
  8.                print("value of a before: "+str(b)+" now it's "+str(a)) 
  9.            return a 
  10.            asyncdefmain(): 
  11.            #creating subroutines. 
  12.            t1 = loop.create_task(fun(50000000,0)) 
  13.            t2 = loop.create_task(fun(100,12)) 
  14.            t3 = loop.create_task(fun(100,41)) 
  15.                await asyncio.wait([t1,t2,t3]) 
  16.            if __name__=="__main__": 
  17.            loop = asyncio.get_event_loop() 
  18.            loop.run_until_complete(main()) 
  19.            loop.close() 

首先觀察該代碼的輸出,接下來討論該代碼:

輸出-1

輸出-2

輸出-1中首先能得到t2和t3進程的結(jié)果,然后在輸出-2的截圖中得到了t1進程的結(jié)果,這是異步編程的功勞。t1進程耗時最長,所以它的結(jié)果最后產(chǎn)生,且t1、t2和t3進程均并行運行。異步編程的好處就在于不必等待任何進程的結(jié)果,便可獲得下一個進程的結(jié)果。

讓我們討論一下此代碼。

首先,在if __name__=="__main__"中定義了asyncio.get_event_loop(),并將這個循環(huán)作為處理循環(huán)事件的異步對象。然后創(chuàng)建一個main的例行程序,并設(shè)置條件:若main沒完成則繼續(xù)循環(huán)。每次異步,都要進行l(wèi)oop.close()的編程,否則結(jié)果就會錯誤或異常。

然后將函數(shù)定義為asyncdeffunc_name,這樣解釋器就知道函數(shù)用了異步的方法。在main()中定義了三個任務(wù)(也可稱為子例程),并使用了await函數(shù),以便它等待三個進程結(jié)束(即使它沒有多大意義,也必須使用它)。

最后用了fun()函數(shù)。i %10000的if條件讓最大范圍的進程徐徐運行,最后得到了答案。仔細研究fun()函數(shù)并自己嘗試的話,其中的邏輯會顯得非常合理和直接。

在Python中實現(xiàn)異步編程,你學(xué)會了嗎?


文章名稱:在Python中實現(xiàn)異步編程,只需要這幾步就夠了
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/dhcdhdj.html