Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在异步IO睡眠期间检查是否有新的控制命令_Python_Python Asyncio - Fatal编程技术网

Python 在异步IO睡眠期间检查是否有新的控制命令

Python 在异步IO睡眠期间检查是否有新的控制命令,python,python-asyncio,Python,Python Asyncio,我正在寻找一种pythonicasyncio“模式”,用于在我的程序中经常出现的构造 辅助任务执行通常由几个步骤组成的一些操作。这些操作的详细信息由控制函数发送到辅助任务的命令控制。各个步骤之间存在休眠,工作人员只能在这些休眠期间接受新命令。新命令应立即将辅助任务从睡眠中唤醒 这些命令表示所需的目标状态。我正在使用队列进行通信。但是,只能有一个目标,这就是为什么这些命令不构建真正的队列,但最后一个目标将替换以前的所有目标。队列最多有一个项目 目前我正在使用其他异步库。我想切换到标准asyncio

我正在寻找一种pythonicasyncio“模式”,用于在我的程序中经常出现的构造

辅助任务执行通常由几个步骤组成的一些操作。这些操作的详细信息由控制函数发送到辅助任务的命令控制。各个步骤之间存在休眠,工作人员只能在这些休眠期间接受新命令。新命令应立即将辅助任务从睡眠中唤醒

这些命令表示所需的目标状态。我正在使用队列进行通信。但是,只能有一个目标,这就是为什么这些命令不构建真正的队列,但最后一个目标将替换以前的所有目标。队列最多有一个项目

目前我正在使用其他异步库。我想切换到标准
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
分配一个新的未来