繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM