Python 3.6中的并发异步函数调用

时间:2018-08-27 14:28:59

标签: python python-asyncio

我有一个脚本,其中Slow和Fast函数处理相同的全局对象数组。 Slow函数用于根据资源密集型计算用新对象填充阵列,Fast函数仅用于迭代阵列中的现有对象并维护/显示它们。慢速功能仅需要每隔几秒钟运行一次,但是快速功能必须尽可能频繁地运行。我尝试使用asyncio和sure_future调用Slow进程,但是结果是Fast(main)函数一直运行到我停止它为止,直到最后才调用Slow函数。我需要Slow函数在它在后台调用的实例中开始运行,并在可能的情况下完成,但又不能阻止Fast函数的调用。你能帮我吗? 谢谢!

我尝试过的例子:

import asyncio
variable = []

async def slow():
    temp = get_new_objects() #resource intensive
    global variable
    variable = temp

async def main():
    while True: #Looping
        if need_to_run_slow: #Only run sometimes
            asyncio.ensure_future(slow())

        do_fast_stuff_with(variable) #fast part

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

1 个答案:

答案 0 :(得分:2)

.logo-img { // to black filter: invert(1); // or to blue // filter: invert(1) sepia(1) saturate(5) hue-rotate(175deg); } 时间表 asyncio.ensure_future(slow())在事件循环的下一个阶段运行。由于您的slow()循环不会等待任何可能实际阻塞的事件,因此您不会给事件循环一个运行的机会。

您可以通过在调用快速函数之后添加while来解决此问题:

await asyncio.sleep(0)

无操作睡眠将确保在async def main(): while True: if need_to_run_slow: asyncio.ensure_future(slow()) await asyncio.sleep(0) do_fast_stuff_with(variable) 循环的每次迭代中(以及在“快速”功能的运行之间)为先前计划的while取得进展提供机会。

但是,您的slow()也不会等待,因此其所有代码将在一次迭代中运行,这使得上述操作等效于简单得多:

slow()

更接近您的实际用例的代码示例可能会导致更直接可用的答案。