基于同步队列的多线程安全资源池
queuepool的Python项目详细描述
例如,psycopg2.pool(https://github.com/psycopg/psycopg2/blob/master/lib/pool.py)的主要问题是,当池中不再有连接时,池引发异常(而不是阻塞),并且您必须将连接数与工作进程数匹配,或者实现重试逻辑。此外,它没有实现连接回收(超时或使用计数),因此,不能完全解决陈旧连接的问题,也不适合大型生产安装(规模更大)。
此实现基于同步队列(https://docs.python.org/3/library/queue.html),因此是多线程安全的。这是一个来自Java版本的流线型端口,大约10年前实现,此后一直在我们的一个金融客户的大型生产环境中运行。
此实现功能:
- 一个通用资源池,可以为特定资源(如psycopg2连接)进行扩展。提供了psycopg2连接池实现。
- 按需懒资源开放。
- 空闲和打开超时循环。需要用户代码定期执行pool.recycle()方法(或通过pool.start recycler()启动回收程序线程),例如每分钟执行一次。如果不定期执行此方法,则仅当资源被获取或返回到池时才执行回收,因此,池可以累积超过空闲或打开超时的空闲连接数。
- 使用计数回收。
- 例外情况下回收。
- 在资源状态下回收。
- 上下文管理器允许将池与“with”上下文管理器一起使用,以便资源可以安全地返回到池中。
- 后进先出队列帮助池将打开的资源数保持在最小。
此池可以成功地用于大型生产安装,因为它试图将开放资源的数量保持在最小,同时提供足够数量的“热”(开放)资源以避免打开/关闭成本。
许可证
OSI批准的3条款BSD许可证
先决条件
- python 3.7+(带队列)
- 对于psycopg2连接:psycopg2 2.8.2+
安装
如果满足先决条件,您可以像任何其他python包一样安装队列池,使用pip从pypi下载它:
$ pip install queuepool
或者使用setup.py如果您已经在本地下载了源包:
$ python setup.py build $ sudo python setup.py install