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

问题描述

我大约有以下代码

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。

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

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

解决方法

如果我对您的理解是正确的,则您希望修改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())(请注意附加括号)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...