本文翻译自:Pool-aiomysql 0.0.9 documentation
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)
——创建与MySQL数据库的连接池的协程。
参数:
- minsize (int) – 连接池的最少连接数目
- maxsize (int) – 连接池的最大连接数据
- loop – 是一个可选的事件循环实例,如果未指定loop,则使用asyncio.get_event_loop()
- echo (bool) – – 执行日志SQL查询(默认为False)
- kwargs – 该函数接受aiomysql.connect()所需的所有参数,以及可选的关键字参数loop,minsize,maxsize。
返回:
Pool实例
Pool类
一个连接池
Pool被创建后,拥有minsize指定的空闲连接,并且能延展到maxsize制定的连接数;
如果minsize为0,则Pool在启动时不会创建任何连接;
如果maxsize为0,则Pool的大小无限制(但当然,它会回收已使用结束的连接);
使用Pool的最重要的方式是获取数据库连接,用下列语句:
with (yield from pool) as conn: cur = yield from conn.cursor()
如不想使用with语句,可另行参考 Pool.acquire()和
Pool.release()的方式获取数据库连接。
Pool类的属性:
1、echo : 返回echo模式状态。 如果为True,则将所有已执行的查询记录到名为aiomysql的logger;
2、minsize : Pool的最小大小(只读),默认为1;
3、maxsize : Pool的最大大小(只读),默认为10;
4、size : 当前Pool的大小(只读),包括使用的和空闲的连接;
5、freesize : Pool中空闲连接的数目(只读);
方法:
1、clear
()
关闭pool
标记所有要关闭的pool连接,已经关闭的pool不允许获得新的连接;
如果你想等待已经获得的连接的实际关闭,请 在 close()方法后调用
wait_closed()。
警告:该方法不是一个协程!
2、terminate
()
终止pool,关闭pool并立即关闭所有已获取的连接。
在terminate()方法后要调用wait_closed()来等待实际的关闭。
警告:该方法不是一个协程!
3、wait_closed
()
一个等待释放和关闭所有已获取连接的协程;
应该在close()之后调用以等待实际的pool关闭。
4、acquire
()
从空闲的pool中获取连接的协程。 根据需要创建新连接,并且pool的大小小于maxsize。
返回一个Connection实例。
5、release
(conn)
将连接conn转换至空闲pool中,以供将来重复利用。
最后再贴出另一种使用connection pool方式的示例代码:
import asyncio import aiomysql async def test_example(loop): pool = await aiomysql.create_pool(host='127.0.0.1', port=3306, user='root', password='', db='mysql', loop=loop) async with pool.acquire() as conn: async with conn.cursor() as cur: await cur.execute("SELECT 42;") print(cur.description) (r,) = await cur.fetchone() assert r == 42 pool.close() await pool.wait_closed() loop = asyncio.get_event_loop() loop.run_until_complete(test_example(loop))