如何解决如何同时运行收集和协同程序任务
我大约有以下代码
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())
(请注意附加括号)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。