关于python协程销毁、超时

概念

协程

  • 通过async/await语法进行声明,是书写python异步应用的推荐方式

可等待对象

  • 如果一个对象可以在await中使用,那么它就是可等待/awaitable对象
    • 类型:协程、任务、Future

async.sleep(delay, result=None, *, loop=None)

  • 阻塞delay指定的秒数
  • sleep()总是为挂起当前任务,以允许其他任务运行

场景

  • Sanic后台任务执行失败被挂起,不报错,影响后续任务的进行

解决方案

对后台任务中可能出现失败的协程增设超时

  • asyncio.wait_for(aw,, timeout, *, loop=None)
    • 等待aw可等待对象完成,指定timeout数后超时取消
    • timeout可以为None,也可以为float/int数值表示的等待秒数。如果timeout为None,则等待直到协程返回
    • 如果发生超时,任务将取消并引发asyncio.TimeoutError
    • 要避免任务取消,可以加上shield()

简单等待

  • asyncio.wait(aws, *, loop=None, return_when=ALL_CONPLETED)
    • 并发地运行aws可迭代对象中的可等待对象并进入阻塞状态直到满足return_when所执行的条件
    • aws可迭代对象必须不为空
    • 此函数不会引发asyncio.TimeoutError,当超时发生时,未完成的Future/Task将在指定秒数后返回;与wait_for()不同,wait()在超时后不会取消可等待对象
posted @ 2021-03-09 11:07  Chaosun  阅读(1415)  评论(0)    收藏  举报