gpt4 book ai didi

Python asyncio,可以等待/产生整个 myFunction()

转载 作者:行者123 更新时间:2023-11-28 22:29:15 24 4
gpt4 key购买 nike

我已经编写了一个对象库,其中许多对象都进行 HTTP/IO 调用。由于开销越来越大,我一直在考虑转向 asyncio,但我不想重写底层代码。

我一直希望将 asyncio 封装在我的代码中,以便异步执行功能,而无需用 await/yield 替换我所有的深层/低级代码。

我开始尝试以下操作:

async def my_function1(some_object, some_params):
#Lots of existing code which uses existing objects
#No await statements
return output_data

async def my_function2():
#Does more stuff

while True:
loop = asyncio.get_event_loop()
tasks = my_function(some_object, some_params), my_function2()
output_data = loop.run_until_complete(asyncio.gather(*tasks))
print(output_data)

我很快意识到,当这段代码运行时,实际上没有任何事情是异步发生的,函数是同步完成的。我对异步编程很陌生,但我认为这是因为我的两个函数都没有使用关键字 await 或 yield 因此这些函数不是协程,也不会产生,因此不提供有机会转移到不同的协程。如果我错了,请纠正我。

我的问题是,是否可以在 asyncio await 关键字中包装复杂的函数(在它们内部进行 HTTP/IO 调用的深处),例如

async def my_function():
print("Welcome to my function")
data = await bigSlowFunction()

更新 - 按照 Karlson 的回答

遵循并感谢 Karlsons 接受的答案,我使用了以下代码,效果很好:

from concurrent.futures import ThreadPoolExecutor
import time

#Some vars
a_var_1 = 0
a_var_2 = 10

pool = ThreadPoolExecutor(3)

future = pool.submit(my_big_function, object, a_var_1, a_var_2)
while not future.done() :
print("Waiting for future...")
time.sleep(0.01)
print("Future done")
print(future.result())

这非常有效,future.done()/ sleep 循环让您了解通过异步可以使用多少 CPU 周期。

最佳答案

简短的回答是,如果不在代码中明确标记控制权可能传回事件循环的点,您就无法享受 asyncio 的好处。这是通过将 IO 繁重的函数转换为协程来完成的,就像您假设的那样。

在不更改现有代码的情况下,您可以使用 greenlet 实现您的目标(查看 eventletgevent)。

另一种可能性是利用 Python 的 Future implementation将对已编写函数的调用包装并传递给某些 ThreadPoolExecutor并产生结果 Future。请注意,这伴随着多线程编程的所有警告。

类似的东西

from concurrent.futures import ThreadPoolExecutor

from thinair import big_slow_function

executor = ThreadPoolExecutor(max_workers=5)

async def big_slow_coroutine():
await executor.submit(big_slow_function)

关于Python asyncio,可以等待/产生整个 myFunction(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com