2016-06-17 33 views
2

私はaiohttp + aiomysqlで遊んでいます。私は要求呼び出しの間に同じ接続プールのインスタンスを共有したい。aiohttp + aiomysql(python 3.5)のシングルトン接続プール

だから私はグローバル変数を作成し、それをcoroutingコールで一度前倒しします。

マイコード:

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) 

はそれがこれを行うにconvinientの方法である、またはより良いものになるかも?

答えて

1

大域変数の使用を強くお勧めします。

の標準については、aiohttp demoをご覧ください。

SiteHandlerは、ウェブサイトの表示を実装するクラスです。

0

ただし、requestのオブジェクトにはアクセスのデモがあります。

私はaiohttpを使用して同じ問題を抱えています。私のアプリケーションでは、モジュールの一部に を実行しました。
1つはサーバー機能用、もう1つはクライアント(クローラ)用です。

だから、サーバーの一部で、それは大丈夫だ、私のことができ、ユーザrequest.app['dbpool']

しかし、クローラの部分に私は別の1つのプール接続を作成するための理由を見ることができない にDB接続を使用したい、と。

+0

同様の質問の別の答えを見つけてください。 https://github.com/aio-libs/aiohttp/issues/2495 あなたは「request.appを伝播する - 技術的には、インポート時にアプリを取得するのと同じレベルの醜さです」と言いました。 グローバルは存在しないので、伝播はありません.... それではどのように??? ... –