我正在使用 aiohttp 构建一个 API 服务器,该服务器将 TCP 请求发送到单独的服务器。发送 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'
原文由 Zac Delventhal 发布,翻译遵循 CC BY-SA 4.0 许可协议
最终我在 这个线程 中找到了答案。我正在寻找的方法是 run_in_executor 。这允许同步函数异步运行而不会阻塞事件循环。
在我上面发布的
sleep
示例中,它可能看起来像这样:另请参阅以下答案 -> 我们如何调用需要协程的普通函数?