aioredis + aiohttp 正确使用连接池
aioredis + aiohttp proper usage of connection pooling
我运行正在编写下面的代码。我试图通过创建一个我可以在 aiohttp 视图对象中使用的全局连接池对象来将 aioredis 与 aiohttp 一起使用。但是 load_redis 函数出错了。我什至不确定这是否是将 aioredis 与 aiohttp 结合使用的正确方法。
#!/usr/bin/env python
import asyncio
import uvloop
from aiohttp import web
from settings import SERVER_IP, SERVER_PORT, REDIS_HOST, REDIS_PORT
import aiohttp_jinja2
import jinja2
import aioredis
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.get_event_loop()
app = web.Application()
aiohttp_jinja2.setup(app,
loader=jinja2.FileSystemLoader('templates'))
REDIS_CONNECTION_POOL = None
async def load_redis():
global REDIS_CONNECTION_POOL
REDIS_CONNECTION_POOL = await aioredis.create_pool(
(REDIS_HOST, REDIS_PORT),
minsize=5, maxsize=10,
loop=loop)
await REDIS_CONNECTION_POOL.execute('set', 'current_code', '00000')
loop.run_until_complete(load_redis())
#prevent import errors
from routes import setup_routes
setup_routes(app)
web.run_app(app, host=SERVER_IP, port=SERVER_PORT)
这是我在 运行 时看到的错误消息:
Traceback (most recent call last):
File "server.py", line 29, in <module>
loop.run_until_complete(load_redis())
File "uvloop/loop.pyx", line 1203, in uvloop.loop.Loop.run_until_complete (uvloop/loop.c:25632)
File "server.py", line 28, in load_redis
await REDIS_CONNECTION_POOL.execute('set', 'current_code', '00000')
AttributeError: 'RedisPool' object has no attribute 'execute'
Task was destroyed but it is pending!
task: <Task pending coro=<RedisPool._do_close() running at /Users/brian/.pyenv/versions/3.6.0/lib/python3.6/site-packages/aioredis/pool.py:117> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x10bb94b58>()]>>
你不需要使用全局变量,而是像这样使用 on_startup
/on_cleanup
信号:http://aiohttp.readthedocs.io/en/stable/web.html#background-tasks
我运行正在编写下面的代码。我试图通过创建一个我可以在 aiohttp 视图对象中使用的全局连接池对象来将 aioredis 与 aiohttp 一起使用。但是 load_redis 函数出错了。我什至不确定这是否是将 aioredis 与 aiohttp 结合使用的正确方法。
#!/usr/bin/env python
import asyncio
import uvloop
from aiohttp import web
from settings import SERVER_IP, SERVER_PORT, REDIS_HOST, REDIS_PORT
import aiohttp_jinja2
import jinja2
import aioredis
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.get_event_loop()
app = web.Application()
aiohttp_jinja2.setup(app,
loader=jinja2.FileSystemLoader('templates'))
REDIS_CONNECTION_POOL = None
async def load_redis():
global REDIS_CONNECTION_POOL
REDIS_CONNECTION_POOL = await aioredis.create_pool(
(REDIS_HOST, REDIS_PORT),
minsize=5, maxsize=10,
loop=loop)
await REDIS_CONNECTION_POOL.execute('set', 'current_code', '00000')
loop.run_until_complete(load_redis())
#prevent import errors
from routes import setup_routes
setup_routes(app)
web.run_app(app, host=SERVER_IP, port=SERVER_PORT)
这是我在 运行 时看到的错误消息:
Traceback (most recent call last):
File "server.py", line 29, in <module>
loop.run_until_complete(load_redis())
File "uvloop/loop.pyx", line 1203, in uvloop.loop.Loop.run_until_complete (uvloop/loop.c:25632)
File "server.py", line 28, in load_redis
await REDIS_CONNECTION_POOL.execute('set', 'current_code', '00000')
AttributeError: 'RedisPool' object has no attribute 'execute'
Task was destroyed but it is pending!
task: <Task pending coro=<RedisPool._do_close() running at /Users/brian/.pyenv/versions/3.6.0/lib/python3.6/site-packages/aioredis/pool.py:117> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x10bb94b58>()]>>
你不需要使用全局变量,而是像这样使用 on_startup
/on_cleanup
信号:http://aiohttp.readthedocs.io/en/stable/web.html#background-tasks