pythonでのaioysql(MySQLの非同期操作)の方法

3674 ワード

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

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
connection
このライブラリはMySQLに接続するために使用され、簡単なaiomysqlを使用します.接続()は、データベースまたは関連プールに接続してより多くの接続を行うことができます.

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())

まとめ
以上、編集者が紹介したaioysql(MySQL非同期操作)-pythonですが、皆さんに役に立つことを願っています.何か質問があれば、メッセージをください.編集者はすぐに皆さんに返事します.