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



我有一个脚本,其中慢速和快速函数处理相同的全局对象数组。Slow 函数用于根据资源密集型计算用新对象填充数组,Fast 仅用于迭代数组中的现有对象并维护/显示它们。慢速函数只需要每隔几秒钟运行一次,但快速函数必须尽可能频繁地运行。我尝试使用 asyncio 并ensure_future调用慢速进程,但结果是 Fast(main( 函数一直运行到我停止它,并且只有在最后才调用慢速函数。我需要 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()

>asyncio.ensure_future(slow())安排slow()在事件循环的下一次传递时运行。由于您的while循环不会等待任何可以实际阻塞的内容,因此您没有给事件循环运行的机会。

可以通过在调用 fast 函数后添加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()也不会等待,因此它的所有代码都将在一次迭代中运行,这使得上述等效于更简单的内容:

def main():
while True:
slow()  # slow() is an ordinary function
do_fast_stuff_with(variable)

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

最新更新