【发布时间】:2017-04-05 20:40:03
【问题描述】:
我正在使用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'
【问题讨论】:
-
你总是阻塞 I/O。使用协作式多任务处理,您无法获得所需的行为,因为阻塞的协程仅在请求完成后才返回控制(yield)。
-
aiohttp 适用于 http。对于非 http TCP,asyncio 就足够了。
标签: python python-3.x asynchronous python-asyncio aiohttp