16、【翻译】aiomysql-Pool

本文翻译自: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=1maxsize=10loop=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))
原文地址:https://www.cnblogs.com/zwb8848happy/p/8809861.html