如何优雅地关闭aiohttp服务器中的aioredis池?



我创建redis pool的方式如下:

async def create_redis_connection_pool(app) -> aioredis.Redis:
redis = aioredis.from_url(
"redis://localhost", encoding="utf-8", decode_responses=True, max_connections=10,
)
app["redis"] = redis
try:
yield
finally:
loop = asyncio.get_event_loop()
await loop.create_task(app["redis"].close())

然后我在创建Aiohttp应用程序时使用该函数:

def init() -> web.Application:
app = web.Application()
...
app.cleanup_ctx.append(create_redis_connection_pool)
...
return app

当我启动服务器,做至少一个请求使用redis池,然后做Cnrl+C我得到以下警告消息:

sys:1: RuntimeWarning: coroutine 'Connection.disconnect' was never awaited

如何解决问题并优雅地关闭Redis连接池?我在Mac OS上做测试。

如果您正在使用redis==4.2.0(from redis import asyncio as aioredis)或更新版本,
在调用.close()时传递close_connection_pool=True:

await app["redis"].close(close_connection_pool=True)

否则,对于aioredis==2.0.1(本回答的最新版本)或更早的版本,
.close()之后调用.connection_pool.disconnect():

await app["redis"].close()
await app["redis"].connection_pool.disconnect()

参考:https://github.com/aio-libs/aioredis-py/pull/1256

相关内容

  • 没有找到相关文章

最新更新