Asyncio:发生异常时等待完成的任务

Posted

技术标签:

【中文标题】Asyncio:发生异常时等待完成的任务【英文标题】:Asyncio : Waiting for completed task when an exception occurs 【发布时间】:2021-05-04 03:20:23 【问题描述】:

代码有 5 名工人在工作。 每个工人都是这样的(短代码):

async def worker(name):   

   queue_item = await queue.get()
   msg = queue_item.message  #<--- first attempt
   #.....#

    try:
        #...get_message fails(timeout)...raise#

    except errors.TimedOutError:
        #Retry to get the message
        msg = await get_messages(queue_item.channel, ids=queue_item.id)  # <-- retry                      

        #in order to process it again I put it in different queue 
        await queue_retry.put(msg)  

但是, await queue_retry 是否等待 msg = await get_messages 完成才能更新队列?

如果没有,我不知道它会放什么msg,我怀疑它不等待新的get_message,它会放旧的。

【问题讨论】:

是的,await get_messages(...) 会等待get_messages(...) 完成后再继续。如果您不确定,请将变量名称更改为 msg2 或其他名称(在 awaitqueye_retry.put 行中),以说服自己您不是在处理旧的 msg 【参考方案1】:

await queue_retry 是否等待msg = await get_messages 完成才能更新队列?

是的:await get_messages(...) 会等待get_messages(...) 完成,然后再继续。如果您不确定,请将变量名称更改为 emg msg2(在 awaitqueue_retry.put lines 中),以说服自己您不是在处理旧的 msg

【讨论】:

以上是关于Asyncio:发生异常时等待完成的任务的主要内容,如果未能解决你的问题,请参考以下文章

asyncio - 多次等待协程(周期性任务)

Python 3.6 asyncio - 从未检索到任务异常 - 任务的产量不好:200

当我清楚地表明我只想完成第一个任务时,为什么所有任务都在asyncio.wait()中完成?

python协程(4):asyncio

asyncio:Python异步编程模块

异步/等待和任务