我需要一个对象池,而不是自己实现,我想我应该找一个现成的且经过测试的Python库。
我发现很多其他人正在寻找,但没有得到很多直接的答案,因此我将其带到了Stack Overflow。
就我而言,我有大量线程(使用threading模块),这些线程有时需要调用基于SOAP的远程服务器。他们每个人都可以建立自己与服务器的连接,但是设置套接字并完成身份验证过程非常昂贵(这受服务器的限制),因此我想共享一个连接池,仅根据需要创建更多连接。
threading
如果要合并的项目是worker子流程,则我可能选择multiprocessing.pool,但不是。如果它们是工作线程,则我可能选择了此实现,但事实并非如此。
multiprocessing.pool
如果它们是MySQL连接,则可能选择了pysqlpool,但不是。同样,SQLAlchemy池已退出。
如果有一个线程,使用可变数量的连接/对象,我会考虑这种实现,但我需要它是线程安全的。
我知道我可以很快再次实现它,但是鉴于有很多人在寻找它,所以我认为关于Stack Overflow的规范答案会很好。
根据您的描述,在我看来,您需要的是 连接 的池,而不是对象的池。为了简单的线程安全,只需将可重用的连接保留在一个Queue.Queue实例中,将其称为pool。当线程实例化一个连接包装对象时,该对象通过其连接来获取连接pool.get()(如果当前没有可用的连接,该对象将自动排队等待,并在连接准备就绪时将其出队);当对象使用其连接完成时,它会通过将其放回池中pool.put。
Queue.Queue
pool
pool.get()
pool.put
除了Queue.Queue已经提供给您的功能之外,其中几乎没有通用的通用功能,因此没有模块是众所周知的,也就不足为奇了- 当包含大约6行功能代码的模块很难被广泛使用总而言之(例如,调用用户提供的连接工厂来提前或及时填充队列,直到达到某个最大数量- 无论如何,这通常不是一个很大的附加值)。毕竟,“厚胶”将标准库模块的基础功能厚实地包装而没有实质性的附加值,毕竟是体系结构上的缺点;-)。