因爲腳本須要在完成事件處理後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的問題,保證主進程不阻塞)