python-複盤-aiomysql

3697 ワード

前言
このaiomysqlを理解するために、ネットでたくさんの資料を探して、ここに整理しました.
python非同期IOプログラミングプローブ
非同期IOを探索する前に、IOの種類についてお話しします
  • はIOをブロックするのが最も簡単で、つまりデータを読み書きする時、操作が完了するのを待ってから実行を続ける必要があります.ステップアップの方法は、IOが必要な部分をマルチスレッドで処理することであり、オーバーヘッドが大きいという欠点がある.
  • 非ブロックIO、すなわち読み書きデータの場合、一時的に読み書きができなければ、すぐに戻り、待たない.いつ読み書きができるか分からないので、ポーリング時にCPU時間が無駄になる可能性があります.
  • IO多重化、すなわち、データを読み書きする前に、どの記述子が読み書き可能であるかを確認してから読み書きする.selectとpollは、監視されているすべての記述子を巡り、満足しているかどうかを確認します.このチェックのプロセスはブロックされています.epoll、kqueue、および/dev/pollは、事前に登録してどの記述子のどのイベントをチェックする必要があるかを改善し、状態が変化すると、カーネルは対応するコールバック関数を呼び出し、これらの記述子を保存します.次に使用可能な記述子を取得する場合は、これらの変更された記述子を直接返します.
  • 信号駆動、すなわち記述子が準備できたら、カーネルはSIGIO信号を送信し、信号処理プログラムによってこれらの信号を処理すればよい.しかし,信号処理のタイミングがカーネル状態からユーザ状態に戻る場合,これらのイベントも収集して処理しなければならないと感じ,シミュレーションIO多重化に似ている.
  • 最後に非同期IO、すなわち読み書きデータの場合、イベントのみが登録され、カーネルが読み書き完了した後(読み取ったデータがユーザ状態にコピーされる)、イベント処理関数が呼び出される.このプロシージャ全体が呼び出しスレッドをブロックしません.

  • Python 3.4から、標準ライブラリにasyncioというモジュールが追加されました.原理的には、Tornadoとはあまり差がなく、IOイベントを登録し、IO loopでイベントの発生を待機し、対応する処理関数を呼び出す.
    aiomysql公式サイト説明(自己翻訳)
    1. pool
    このライブラリでは、簡単な接続オブジェクトの使用方法を示します.
    import asyncio
    import aiomysql
    
    loop = asyncio.get_event_loop()
    
    @asyncio.coroutine
    def go()
        pool = yield from aiomysql.create_pool(host='127.0.0.1', port=3306,
                                               user='root', password='',
                                               db='mysql', loop=loop)
    
        with (yield from pool) as conn:
            cur = yield from conn.cursor()
            yield from cur.execute("SELECT 10")
            # print(cur.description)
            (r,) = yield from cur.fetchone()
           assert r == 10
        pool.close()
        yield from pool.wait_closed()
    
    loop.run_until_complete(go())
    

    解釈:create_pool(minsize=1, maxsize=10, loop=None, **kwargs)コパス、接続プールの作成、接続databaseパラメータ:minsize(int)最小のプール、逆にmaxsize(int)loopオプションのイベントループインスタンス、ループしない場合はasyncio.get_event_loop() echo(bool)デフォルトlogを使用してSQLクエリーkwargsを実行
    Class pool:最も重要なのは接続を得ることです.
    with (yield from pool) as conn:
        cur = yield from conn.cursor()
    

    2. aiomysql — API Reference
    接続このライブラリはMySQLに接続するために使用され、簡単なaiomysql.connect()を使用して、データベースまたは関連プールに接続してより多くの接続を行うことができます.
    import asyncio   #     
    import aiomysql
    
    loop = asyncio.get_event_loop()
    
    @asyncio.coroutine
    def test_example():
        conn = yield from aiomysql.connect(host='127.0.0.1', port=3306,
                                           user='root', password='', db='mysql',
                                           loop=loop)
    
        cur = yield from conn.cursor()
        yield from cur.execute("SELECT Host,User FROM user")
        print(cur.description)
        r = yield from cur.fetchall()
        print(r)
        yield from cur.close()
        conn.close()
    
    loop.run_until_complete(test_example())
    

    3.Cursorsカーソル
    import asyncio
    import aiomysql
    
    loop = asyncio.get_event_loop()
    
    @asyncio.coroutine
    def test_example():
        conn = yield from aiomysql.connect(host='127.0.0.1', port=3306,
                                           user='root', password='',
                                           db='mysql', loop=loop)
    
        # create default cursor
        cursor = yield from conn.cursor()
    
        # execute sql query   #   sql  
        yield from cursor.execute("SELECT Host, User FROM user")
    
        # fetch all results
        r = yield from cursor.fetchall()
    
        # detach cursor from connection
        yield from cursor.close()
    
        # close connection
        conn.close()
    
    loop.run_until_complete(test_example())