後臺程序處理 (一)python asyncio 協程使用

因爲腳本須要在完成事件處理後N秒檢查事件處理結果,當執行失敗時再執行另外一個事件處理。異步

想要最小化完成這個功能。同時在第一時間就將執行完畢的結果反饋給接口。async

所以想到使用協程。 使用以前先翻閱了一下現有的文檔。以及參考了其餘人的代碼。函數

先改寫成以下的用例:oop

 1 import asyncio
 2 
 3 async def do_some_work(x):
 4     try:
 5         return "success"
 6     finally:
 7         print('it can test')
 8         await asyncio.sleep(3)
 9         print('Waiting: ', x)
10 
11 
12 coroutine = do_some_work(2)
13 coroutine2 = do_some_work(3)
14 loop = asyncio.get_event_loop()
15 # task = asyncio.ensure_future(coroutine)
16 task = loop.create_task(coroutine)
17 task = loop.create_task(coroutine2)
18 loop.run_until_complete(task)

 

與網上講單協程的內容不一樣。我不用特地關心協程的執行時間。而更加關注幾個方法的使用spa

所以上面的代碼包含以下內容:code

1.建立一個協程的函數。函數內容以下:協程

  A.函數執行成功後會返回結果blog

  B.函數首先執行try語句,將return事件註冊接口

  C.其次執行print,輸出it is test進程

  D.而後將協程掛起(此處模擬掛起,實質上咱們是但願執行完成一個return以後結束掉一個協程,運行另外一個協程)。掛起時間也能夠用傳參來設置

  E.確認等待以後協程繼續執行,所以還有一個print事件,經過x的傳參確認協程最終執行

2.建立兩個協程調用。用來確認asyncio模塊其實是建立了一個協程池(簡單說就是task不會被覆蓋,線性調用方法註冊事件)。每次使用方法調用loop.create_task的時候,將建立一個協程。

 

最後是執行結果:

 

執行結果來看。運行機制並非如以前想象的同樣(由於只返回了一個success)

所以咱們稍微改寫一下上面的代碼

 1 import asyncio
 2 
 3 async def do_some_work(x):
 4     try:
 5         return "success work"
 6     finally:
 7         print('it can test')
 8         await asyncio.sleep(3)
 9         print('Waiting: ', x)
10 
11 async def do_return(x):
12     print('it can return %s' % x)
13     return "success return"
14 
15 coroutine = do_some_work(2)
16 coroutine2 = do_return(3)
17 loop = asyncio.get_event_loop()
18 # task = asyncio.ensure_future(coroutine)
19 task = loop.create_task(coroutine2)
20 task = loop.create_task(coroutine)
21 loop.run_until_complete(task)

 

參考return在Python中的實際作法(try-finally)。說明協程只有一個return。即,最後執行時註冊的那一條。

所以仍是須要繼續改寫這個函數。(由於這樣看來,只是簡單解決了異步IO的問題,保證主進程不阻塞)

相關文章
相關標籤/搜索