如何在异步协程中包装同步函数?

我正在使用aiohttp构建一个将TCP请求发送到单独服务器的API服务器。 发送TCP请求的模块是同步的,并且是我的目的的黑盒子。 所以我的问题是这些请求阻止了整个API。 我需要一种将模块请求封装在异步协程中的方法,该协议不会阻塞其余的API。

那么,只要使用sleep作为一个简单的例子,有没有什么办法可以将非常耗时的同步代码封装在非阻塞协程中,如下所示:

async def sleep_async(delay):
    # After calling sleep, loop should be released until sleep is done
    yield sleep(delay)
    return 'I slept asynchronously'

最终我在这个主题中找到了答案。 我正在寻找的方法是run_in_executor。 这允许异步运行同步功能而不阻塞事件循环。

在上面发布的sleep示例中,它可能如下所示:

import asyncio
from time import sleep
from concurrent.futures import ProcessPoolExecutor

async def sleep_async(loop, delay):
    # Can set executor to None if a default has been set for loop
    await loop.run_in_executor(ProcessPoolExecutor(), sleep, delay)
    return 'I slept asynchronously'

另请参阅以下答案 - >我们如何在需要协程的情况下调用正常函数?

链接地址: http://www.djcxy.com/p/53227.html

上一篇: How can I wrap a synchronous function in an async coroutine?

下一篇: async def and coroutines, what's the link