【发布时间】:2026-01-27 13:45:01
【问题描述】:
我有几个阻塞函数foo、bar 并且我无法更改它们(一些我无法控制的内部库。与一个或多个网络服务通信)。我如何将它用作异步?例如。我不想做以下事情。
results = []
for inp in inps:
val = foo(inp)
result = bar(val)
results.append(result)
这将是低效的,因为我可以在等待第一个输入时调用 foo 来获取第二个输入,而对于 bar 则相同。如何包装它们以便它们可以与 asyncio 一起使用(即新的async、await 语法)?
假设函数是可重入的。即当之前的foo 已经在处理时,再次调用foo 是可以的。
更新
使用可重复使用的装饰器扩展答案。比如点击here。
def run_in_executor(f):
@functools.wraps(f)
def inner(*args, **kwargs):
loop = asyncio.get_running_loop()
return loop.run_in_executor(None, functools.partial(f, *args, **kwargs))
return inner
【问题讨论】:
-
你试过看* Documentation on asyncio吗?转到异步执行器。
-
* 文档已关闭
标签: python python-3.x async-await python-3.5 python-asyncio