我有一个脚本,其中慢速和快速函数处理相同的全局对象数组。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)
更接近您的实际用例的代码示例可能会产生更直接可用的答案。