標籤:線性 結果 網上 work 問題 turn 協程 eve cio
由於指令碼需要在完成事件處理後N秒檢查事件處理結果,當執行失敗時再執行另一個事件處理。
想要最小化完成這個功能。同時在第一時間就將執行完畢的結果反饋給介面。
因此想到使用協程。 使用之前先翻閱了一下現有的文檔。以及參考了其他人的代碼。
先改寫成如下的用例:
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)
與網上講單協程的內容不同。我不用特意關心協程的執行時間。而更加關注幾個方法的使用
因此上面的程式碼封裝含如下內容:
1.建立一個協程的函數。函數內容如下:
A.函數執行成功後會返回結果
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的問題,保證主進程不阻塞)
python asyncio 協程使用 (一)