connection_pool模块说明¶
connection_pool模块定义了一个通用的支持异步模式的网络连接池框架,支持通过对已有的连接模块快速实现对应的连接池管理能力,例如实现网络连接池和数据库连接池。
模块标准使用步骤(以sqlite为例)¶
1、开发PoolConnectionFW的实现类,继承PoolConnectionFW并且实现需要实现的函数:
from HiveNetCore.utils.run_tool import AsyncTools
from HiveNetCore.connection_pool import PoolConnectionFW
class SQLitePoolConnection(PoolConnectionFW):
"""
SQLite连接池连接对象
"""
#############################
# 需要继承类实现的函数
#############################
async def _real_ping(self, *args, **kwargs) -> bool:
"""
实现类的真实检查连接对象是否有效的的函数
@returns {bool} - 返回检查结果
"""
# 不支持检测连接, 直接返回True就好
return True
async def _fade_close(self) -> Any:
"""
实现类提供的虚假关闭函数
注1: 不关闭连接, 只是清空上一个连接使用的上下文信息(例如数据库连接进行commit或rollback处理)
注2: 如果必须关闭真实连接, 则可以关闭后创建一个新连接返回
@returns {Any} - 返回原连接或新创建的连接
"""
_close_action = self._pool._pool_extend_paras.get('close_action', None)
if _close_action == 'commit':
await AsyncTools.async_run_coroutine(self._conn.commit())
elif _close_action == 'rollback':
await AsyncTools.async_run_coroutine(self._conn.rollback())
return self._conn
async def _real_close(self):
"""
实现类提供的真实关闭函数
"""
await AsyncTools.async_run_coroutine(self._conn.close())
2、使用AIOConnectionPool创建连接池
import aiosqlite
import sqlite3
from HiveNetCore.utils.run_tool import AsyncTools
from HiveNetCore.connection_pool import AIOConnectionPool
# 创建连接池, 注意会通过aiosqlite.connect函数创建连接对象;另外SQLitePoolConnection是上面实现的PoolConnectionFW继承类
_pool = AIOConnectionPool(
aiosqlite, SQLitePoolConnection, args=['test.db'], kwargs={'timeout': 10.0},
connect_method_name='connect', max_size=1, min_size=0, connect_on_init=True,
get_timeout=1,
free_idle_time=5, ping_on_get=True, ping_on_back=True, ping_on_idle=True,
ping_interval=5
)
# 从连接池获取一个连接, 注意这里是一个异步io的函数调用
_conn = AsyncTools.sync_run_coroutine(_pool.connection())
# 使用连接对象进行操作
try:
# 可以使用连接对象自身特有函数进行处理
...
finally:
# 关闭连接对象, 把对象还回连接池, 注意这里是一个异步io的函数调用
AsyncTools.sync_run_coroutine(_conn.close())
# 关闭连接池, 注意这里是一个异步io的函数调用
AsyncTools.sync_run_coroutine(_conn.close())