python携程asyncio_python asyncio 协程使用 (一)

由于脚本需要在完成事件处理后N秒检查事件处理结果,当执行失败时再执行另一个事件处理。

想要最小化完成这个功能。同时在第一时间就将执行完毕的结果反馈给接口。

因此想到使用协程。 使用之前先翻阅了一下现有的文档。以及参考了其他人的代码。

先改写成如下的用例:

1 importasyncio2

3 async defdo_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 importasyncio2

3 async defdo_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 defdo_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的问题,保证主进程不阻塞)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值