Python 在异步IO睡眠期间检查是否有新的控制命令
我正在寻找一种pythonicasyncio“模式”,用于在我的程序中经常出现的构造 辅助任务执行通常由几个步骤组成的一些操作。这些操作的详细信息由控制函数发送到辅助任务的命令控制。各个步骤之间存在休眠,工作人员只能在这些休眠期间接受新命令。新命令应立即将辅助任务从睡眠中唤醒 这些命令表示所需的目标状态。我正在使用队列进行通信。但是,只能有一个目标,这就是为什么这些命令不构建真正的队列,但最后一个目标将替换以前的所有目标。队列最多有一个项目 目前我正在使用其他异步库。我想切换到标准Python 在异步IO睡眠期间检查是否有新的控制命令,python,python-asyncio,Python,Python Asyncio,我正在寻找一种pythonicasyncio“模式”,用于在我的程序中经常出现的构造 辅助任务执行通常由几个步骤组成的一些操作。这些操作的详细信息由控制函数发送到辅助任务的命令控制。各个步骤之间存在休眠,工作人员只能在这些休眠期间接受新命令。新命令应立即将辅助任务从睡眠中唤醒 这些命令表示所需的目标状态。我正在使用队列进行通信。但是,只能有一个目标,这就是为什么这些命令不构建真正的队列,但最后一个目标将替换以前的所有目标。队列最多有一个项目 目前我正在使用其他异步库。我想切换到标准asyncio
asyncio
。例如:
# warning: not asyncio code; not real code
cmd_queue = Queue()
async def worker():
cmd = 'INIT'
while cmd != 'STOP':
... do_something1 sync or async ...
newcmd = await cmd_queue.get(timeout=SLEEPTIME1, timeout_value=None)
if newcmd is not None:
cmd = newcmd
continue
... do_something2 sync or async ...
newcmd = await cmd_queue.get(timeout=SLEEPTIME2, timeout_value=None)
if newcmd is not None:
cmd = newcmd
continue
def controlloler():
...
if newcmd:
cmd_queue.clear() # replaces a waiting command
cmd_queue.put(newcmd) # put_nowait() in asyncio
...
我可以将队列的形式重写为异步代码:
try:
cmd=wait_for(cmd_queue.get(), timeout=SLEEPTIME)
continue # or process otherwise
except asyncio.TimeoutError:
pass
但我想也许有一个更简单的解决办法。如果你有asyncio的经验,并且认为超时队列是最好的选择,那对我也有帮助
我试图搜索,但找不到适合我的问题的关键字(问题标题也是如此)。您的超时实现肯定没有问题。asyncio原语上的方法故意不支持显式超时参数,让调用方在需要时使用取消或等待超时
对于单个元素队列,我会考虑用A替换它,它不仅被设计成保持单个值,而且在AsiCIIO中也是非常轻量级的,因为它是用来构建几乎所有其他事物的基本抽象。
您将编写
等待(cmd\u queue.get(),…)
,而不是等待(cmd\u future,…)
,而不是cmd\u queue.put(value)
,您将编写cmd\u future.set\u result(value)
。唯一重要的区别是未来是一次性的,因此在获得一个项目后,您需要为cmd\u future
分配一个新的未来