aiohttp+aiomysql 的单例连接池 (python 3.5)
singleton connections pool for aiohttp+aiomysql (python 3.5)
我在玩aiohttp+aiomysql。我想在请求调用之间共享相同的连接池实例。
所以我创建了一个全局变量并在协程调用中预初始化它一次。
我的代码:
import asyncio
from aiohttp import web
from aiohttp_session import get_session, session_middleware
from aiohttp_session.cookie_storage import EncryptedCookieStorage
from aiohttp_session import SimpleCookieStorage
#from mysql_pool import POOL
from aiomysql import create_pool
M_POOL = None
async def get_pool(loop):
global M_POOL
if M_POOL: return M_POOL
M_POOL = await create_pool(host='127.0.0.1', port=3306, user='user', password='user', db='test', loop=loop)
return M_POOL
async def query(request):
loop = asyncio.get_event_loop()
pool = await get_pool(loop)
print(id(pool))
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute("SELECT 42;")
value = await cur.fetchone()
print(value)
return web.Response(body=str.encode(str(value)))
app = web.Application(middlewares=[session_middleware(SimpleCookieStorage())])
app.router.add_route('GET', '/query', query)
web.run_app(app)
这样做是否方便,或者可能更好?
我强烈反对使用全局变量。
请查看 aiohttp demo 以获得 规范 方法。
SiteHandler 是实现网站浏览量的class。
但是您已经演示了 request
对象在访问中的情况。
我在使用 aiohttp 时遇到了同样的问题。在我的应用程序中
对部分模块完成:
一种用于服务器功能,一种用于客户端(爬虫)。
所以在服务器部分没问题,我可以用户 request.app['dbpool']
但在爬虫部分我想使用数据库连接,并且
我看不到创建另一个池连接的原因。
我在玩aiohttp+aiomysql。我想在请求调用之间共享相同的连接池实例。
所以我创建了一个全局变量并在协程调用中预初始化它一次。
我的代码:
import asyncio
from aiohttp import web
from aiohttp_session import get_session, session_middleware
from aiohttp_session.cookie_storage import EncryptedCookieStorage
from aiohttp_session import SimpleCookieStorage
#from mysql_pool import POOL
from aiomysql import create_pool
M_POOL = None
async def get_pool(loop):
global M_POOL
if M_POOL: return M_POOL
M_POOL = await create_pool(host='127.0.0.1', port=3306, user='user', password='user', db='test', loop=loop)
return M_POOL
async def query(request):
loop = asyncio.get_event_loop()
pool = await get_pool(loop)
print(id(pool))
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute("SELECT 42;")
value = await cur.fetchone()
print(value)
return web.Response(body=str.encode(str(value)))
app = web.Application(middlewares=[session_middleware(SimpleCookieStorage())])
app.router.add_route('GET', '/query', query)
web.run_app(app)
这样做是否方便,或者可能更好?
我强烈反对使用全局变量。
请查看 aiohttp demo 以获得 规范 方法。
SiteHandler 是实现网站浏览量的class。
但是您已经演示了 request
对象在访问中的情况。
我在使用 aiohttp 时遇到了同样的问题。在我的应用程序中
对部分模块完成:
一种用于服务器功能,一种用于客户端(爬虫)。
所以在服务器部分没问题,我可以用户 request.app['dbpool']
但在爬虫部分我想使用数据库连接,并且 我看不到创建另一个池连接的原因。