因为脚本须要在完成事件处理后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的问题,保证主进程不阻塞)