将第三方库转换为 asyncio

Convert third party library to asyncio

我有一个第三方库(在本例中为 azure-cosmos)执行缓慢的阻塞操作。我想将它与 asyncio 库一起使用,以利用一定程度的并行性,这样我就可以启动另一个请求,因为一个请求正在等待我们的数据。

我在网上四处寻找,但无法找到关于如何执行外部库包装的具体答案;是不是很简单:

def external_sync_method(*args, **kwargs):
    ...

async def my_async_code():
    args_list = [...]
    return await asyncio.gather(*(external_sync_method(*args) for args in args_list))

异步运行函数func在单独的线程中。

python >= 3.9

https://docs.python.org/3/library/asyncio-task.html#asyncio.to_thread

async def my_async_code():
    args_list = [...]
    return await asyncio.gather(
        *(
            asyncio.to_thread(external_sync_method, *args)
            for args in args_list
        )
    )

python < 3.9

https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor

async def run_sync_method(func, *args, **kwargs):
    loop = asyncio.get_running_loop()
    func_call = functools.partial(func, *args, **kwargs)
    return await loop.run_in_executor(None, func_call)


async def my_async_code():
    args_list = [...]
    return await asyncio.gather(
        *(
            run_sync_method(external_sync_method, *args)
            for args in args_list
        )
    )