我有一个脚本,其中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()
答案 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()
更接近您的实际用例的代码示例可能会导致更直接可用的答案。