zoukankan      html  css  js  c++  java
  • 后台程序处理 (一)python asyncio 协程使用

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

  • 相关阅读:
    iOS 面试题搜集
    iOS 常用第三方类库、完整APP示例
    iOS 键盘遮挡输入 解决办法
    iOS UIColor RGB HEX
    iOS APP性能优化
    iOS Swift 数组 交换元素的两种方法
    iOS CoreData primitive accessor
    iOS Start developing ios apps (OC) pdf
    iOS 传值方式
    iOS IB_DESIGNABLE IBInspectable @IBDesignable @IBInspectable 加速UI开发
  • 原文地址:https://www.cnblogs.com/ranyuu/p/7514215.html
Copyright © 2011-2022 走看看