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

  • 相关阅读:
    css面试题目
    5. React-Router05 BrowserRouter 和hashrouter
    5. React-Router03 withRouter
    5. React-Router01
    CVE-2019-0708—微软RDP远程桌面代码执行漏洞复现
    正则表达式学习汇总
    CTF---PHP安全考题
    快速搭建主动诱导型开源蜜罐框架系统--hfish
    python--爬取网页存在某字符
    Linux 实用指令之查看端口开启情况
  • 原文地址:https://www.cnblogs.com/ranyuu/p/7514215.html
Copyright © 2011-2022 走看看