自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Python中實現(xiàn)異步編程,只需要這幾步就夠了

新聞 前端
異步編程是并行編程的一種方式。單個工作單元獨立于主應用程序線程運行,并通知調用線程其完成、失敗情況或進度。

   [[348195]]

圖源:unsplash

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

在Python中實現(xiàn)異步編程,只需要這幾步就夠了

同步vs異步

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

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

簡言之,只要打開任務管理器(macOS中的活動監(jiān)視器)就能看到多個應用程序同步運行;或者一個Python Shell在兩個不同的終端窗口中運行。專業(yè)術語叫做多進程(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() 

以上代碼的輸出:

在Python中實現(xiàn)異步編程,只需要這幾步就夠了

這段代碼傳遞了for循環(huán)的范圍。執(zhí)行代碼耗時長達13.843秒,因為r1的范圍是5000,所以耗時久?,F(xiàn)在的問題是,必須先待r1任務完成,否則無法得到r2和r3。可能在得到r1之前就得到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() 

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

在Python中實現(xiàn)異步編程,只需要這幾步就夠了

輸出-1

在Python中實現(xiàn)異步編程,只需要這幾步就夠了

輸出-2

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

讓我們討論一下此代碼。

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

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

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

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

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2023-09-05 07:55:56

Python網(wǎng)絡爬蟲

2022-08-24 16:26:51

Linuxcheat 命令

2023-10-04 17:31:21

項目部署軟件包

2024-06-04 14:20:47

數(shù)字化轉型數(shù)字化

2018-03-07 10:03:40

2009-04-09 16:52:47

LinuxUbuntu 9.04

2023-05-23 10:01:51

冪等性抽象代數(shù)

2018-08-03 12:21:02

2021-04-16 09:17:39

機器學習人工智能AI

2021-07-13 08:14:27

色彩用色類型輔助色

2016-12-13 17:02:49

androidjava移動應用開發(fā)

2018-01-09 15:44:57

2021-05-07 07:52:51

Java并發(fā)編程

2010-03-16 16:47:25

Ubuntu 9.04

2022-07-06 12:07:06

Python函數(shù)式編程

2023-12-07 09:07:58

2019-10-28 11:30:43

架構數(shù)據(jù)結構布隆過濾器

2023-10-11 12:45:49

Windows系統(tǒng)

2021-08-02 07:23:54

爬蟲requests網(wǎng)絡庫
點贊
收藏

51CTO技術棧公眾號