如何同时运行收集和协同程序任务

问题描述

我大约有以下代码@H_502_1@

import asyncio
.
.
.
async def query_loop()
    while connected:
        result = await asyncio.gather(get_value1,get_value2,get_value3)
        if True in result:
            connected = False

async def main():
    await query_loop()

asyncio.run(main())

get_value-函数查询设备,接收值并将其发布到服务器。如果没有问题,则返回False,否则返回True。@H_502_1@

现在,我需要实现get_value2-函数检查它是否接收到值7。在这种情况下,我需要程序等待3分钟,然后再向设备发送特殊命令。但与此同时,此后,query_loop也应继续。@H_502_1@

有人知道怎么做吗? 预先感谢!@H_502_1@

解决方法

如果我对您的理解是正确的,则您希望修改get_value2,以便它通过在后台生成其他工作来对从设备接收到的值做出反应,即执行某些操作而无需query_loop中的循环等待新工作完成。

您可以使用asyncio.create_task()生成后台任务。实际上,您始终可以结合使用create_task()await在后​​台运行事物。 asyncio.gather只是为您执行的实用程序功能。在这种情况下,query_loop保持不变,并且get_value2的修改如下:

async def get_value2():
    ...
    value = await receive_value_from_device()
    if value == 7:
        # schedule send_command() to run,but don't wait for it
        asyncio.create_task(special_command())
    ...
    return False

async def special_command():
    await asyncio.sleep(180)
    await send_command_to_device(...)

请注意,如果get_value1和其他函数是异步函数,则必须调用gather的正确调用,因此应为await asyncio.gather(get_value1(),get_value2(),get_value3())(请注意附加括号)。