看了一圈, 没看到稍微好用的ConnectionPool, 除了一个aiomysql, 但是这个是异步的, 我暂时没有用到这么高版本的Python, 所以就动手造一个轮子.

原理比较简单, 先造一个线程安全的集合, 无非就是Lock+Set, 然后修改PyMySQL的close方法, 把实例对象和我的这个集合关联起来, close的时候丢进集合里面

这里是代码:

import threading
import pymysql def new_close(conn):
if conn.pooling != None:
conn.pooling.put(conn)
elif conn.old_close != None:
conn.old_close() class Pool(object):
def __init__(self, create_instance, max_count=10, timeout=10):
self.lock = threading.Lock()
self.condition = threading.Condition(self.lock)
self.in_use_list = set()
self.free_list = set()
self.max_count = max_count or 10
self.timeout = timeout or 10
self.new_instance = create_instance
assert (create_instance != None)
self.__change_pymysql_close() def __change_pymysql_close(self):
old_close = pymysql.connections.Connection.close
if old_close == new_close:
return
pymysql.connections.Connection.close = new_close
pymysql.connections.Connection.old_close = old_close def get(self):
"""get one from free list"""
with self.lock:
if len(self.free_list) > 0:
one = self.free_list.pop()
self.in_use_list.add(one)
return one
if len(self.in_use_list) < self.max_count:
one = self.new_instance()
one.pooling = self
self.free_list.add(one)
if len(self.free_list) <= 0:
self.condition.wait(self.timeout)
if len(self.free_list) <= 0:
raise TimeoutError()
one = self.free_list.pop()
self.in_use_list.add(one)
return one def put(self, value):
"""put one into free list"""
with self.lock:
self.in_use_list.remove(value)
self.free_list.add(value)
self.condition.notify_all() def size(self):
with self.lock:
return len(self.free_list) + len(self.in_use_list) def max_size(self):
return self.max_count

这里是使用的代码, 你只需要像往常一样写代码, 不需要调用额外的put函数把connection还回去:

def create_conn():
return pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, password=mysql_password, database=mysql_db,
charset='utf8', autocommit=True) pool = pymysqlpool.Pool(create_instance=create_conn) conn = pool.get()
cur = conn.cursor()
cur.execute("select 1")
for x in cur:
print(x) cur.close()
conn.close()

https://github.com/egmkang/PyMySQLPool

https://github.com/aio-libs/aiomysql

实现一个简单的ConnectionPool的更多相关文章

  1. 一个简单的ConnectionPool,手动搞

    看了一圈, 没看到稍微好用的ConnectionPool, 除了一个aiomysql, 但是这个是异步的, 我暂时没有用到这么高版本的Python, 所以就动手造一个轮子. 原理比较简单, 先造一个线 ...

  2. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  3. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  4. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  5. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  6. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  7. CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能

    CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...

  8. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator

    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...

  9. 应用OpenMP的一个简单的设计模式

    小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...

随机推荐

  1. Python sax模块(SAX解析XML)

    XML样例: <?xml version="1.0"?> <collection shelf="New Arrivals"> <m ...

  2. Sql Full-Text Filter

    SQL Server 全文索引介绍(转载) 概述 全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询.全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中.全文索引是 ...

  3. SQL Server 2016新特性: 对JSON的支持

     SQL Server 2005开始支持XML数据类型,提供原生的XML数据类型.XML索引及各种管理或输出XML格式的函数.随着JSON的流行,SQL Server2016开始支持JSON数据类 ...

  4. CentOS6.5内 MySQL5.7.19编译安装

    作为博主这样的Linux菜鸟,CentOS下最喜欢的就是yum安装.但有时候因为特殊情况(例如被墙等),某些软件可能没办法直接通过yum来安装,这时候我们可以使用编译安装或者直接二进制文件安装. 本博 ...

  5. Nginx 出现 403 Forbidden 最终解决

    Nginx 出现 403 Forbidden 最终解决 步骤一: 检查目录权限.权限不足的就加个权限吧. 例子:chmod -R 755 / var/www 步骤二: 打开nginx.conf 例子: ...

  6. MySql基本使用方法

    一,基本概念 1, 常用的两种引擎:         (1) InnoDB        a,支持ACID,简单地说就是支持事务完整性.一致性:         b,支持行锁,以及类似ORACLE的一 ...

  7. Java访问级别修饰符

    用途 控制其他类可以访问的字段或方法 修饰符 public.protected.no modifier(未声明).private 访问级别 修饰符 当前类 包 子类 其他包 public √ √ √ ...

  8. 阿里云CentOS下nodejs安装

    1. 下载node包(包含npm) cd /usr/local/src/ wget https://nodejs.org/dist/v10.11.0/node-v10.11.0-linux-x64.t ...

  9. hover效果的几种方式

    1.改变透明度 #share_wrap a{display: inline-block;width: 48px;height: 44px;background: url(/images/finance ...

  10. 6.04-news_xpath3

    from lxml import etree html = """ <html> <body> <ul> <li>1 &l ...