[英]Concurrent Async Function call in Python 3.6
我有一个脚本,其中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()
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)
一个更接近您实际用例的代码示例可能会导致更直接可用的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.