我想在 Tornado 应用程序中使用aioredis 。但是,我想不出一种方法来实现其资源的异步启动和关闭,因为 Application 类没有 ASGI Lifespan事件,例如 Quart 或 FastAPI。换句话说,我需要在应用程序开始服务请求之前创建一个 Redis 池,并在应用程序完成或即将结束后立即释放该池。问题是 aioredis pool 创建是异步的,而 Tornado Application 创建是同步的。
基本应用程序如下所示:
import os
from aioredis import create_redis_pool
from aioredis.commands import Redis
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.web import Application
from .handlers import hello
redis: Redis = None
async def start_resources() -> None:
'''
Initialize resources such as Redis and Database connections
'''
global redis
REDIS_HOST = os.environ['REDIS_HOST']
REDIS_PORT = os.environ['REDIS_PORT']
redis = await create_redis_pool((REDIS_HOST, REDIS_PORT), encoding='utf-8')
async def close_resources() -> None:
'''
Release resources
'''
redis.close()
await redis.wait_closed()
def create_app() -> Application:
app = Application([
("/hello", hello.HelloHandler),
])
return app
if __name__ == '__main__':
app = create_app()
http_server = HTTPServer(app)
http_server.listen(8000)
IOLoop.current().start()
重要的是我也可以在测试期间使用启动和关闭功能。
有任何想法吗?