当前位置: 首页 > 面试题库 >

对象池设计模式的Python实现

桂嘉年
2023-03-14
问题内容

我需要一个对象池,而不是自己实现,我想我应该找一个现成的且经过测试的Python库。

我发现很多其他人正在寻找,但没有得到很多直接的答案,因此我将其带到了Stack Overflow。

就我而言,我有大量线程(使用threading模块),这些线程有时需要调用基于SOAP的远程服务器。他们每个人都可以建立自己与服务器的连接,但是设置套接字并完成身份验证过程非常昂贵(这受服务器的限制),因此我想共享一个连接池,仅根据需要创建更多连接。

如果要合并的项目是worker子流程,则我可能选择multiprocessing.pool,但不是。如果它们是工作线程,则我可能选择了此实现,但事实并非如此。

如果它们是MySQL连接,则可能选择了pysqlpool,但不是。同样,SQLAlchemy池已退出。

如果有一个线程,使用可变数量的连接/对象,我会考虑这种实现,但我需要它是线程安全的。

我知道我可以很快再次实现它,但是鉴于有很多人在寻找它,所以我认为关于Stack Overflow的规范答案会很好。


问题答案:

根据您的描述,在我看来,您需要的是 连接
的池,而不是对象的池。为了简单的线程安全,只需将可重用的连接保留在一个Queue.Queue实例中,将其称为pool。当线程实例化一个连接包装对象时,该对象通过其连接来获取连接pool.get()(如果当前没有可用的连接,该对象将自动排队等待,并在连接准备就绪时将其出队);当对象使用其连接完成时,它会通过将其放回池中pool.put

除了Queue.Queue已经提供给您的功能之外,其中几乎没有通用的通用功能,因此没有模块是众所周知的,也就不足为奇了-
当包含大约6行功能代码的模块很难被广泛使用总而言之(例如,调用用户提供的连接工厂来提前或及时填充队列,直到达到某个最大数量-
无论如何,这通常不是一个很大的附加值)。毕竟,“厚胶”将标准库模块的基础功能厚实地包装而没有实质性的附加值,毕竟是体系结构上的缺点;-)。



 类似资料:
  • 空对象(Null) Intent 使用什么都不做 的空对象来代替 NULL。 一个方法返回 NULL,意味着方法的调用端需要去检查返回值是否是 NULL,这么做会导致非常多的冗余的检查代码。并且如果某一个调用端忘记了做这个检查返回值,而直接使用返回的对象,那么就有可能抛出空指针异常。 Class Diagram Implementation // java public abstract clas

  • 问题内容: 我需要为我的可定制搜索界面(正在编写的Web应用程序)在Java中实现查询对象模式。 有人知道我可以从哪里获得查询对象模式的示例/教程(马丁·福勒的QoP)吗? 提前致谢 附加 如何将查询模式添加到现有DAO模式? 问题答案: “查询对象模式”中的单词“模式”放错了位置(IMHO)。这不是真正的设计模式。“查询对象”只是解释器模式的另一个示例。遗留的Hibernate Criteria

  • 我试图创建一个通用对象转换器,为我的dto<->实体类。我创建了一个抽象类,它有两个函数代表两种转换,然后在我的具体转换器类中扩展了它。 但我希望有一个通用的转换服务,我可以在启动期间注册所有的转换器,然后方便地调用一个方法来处理彼此之间的转换。 到目前为止,我想说的是: 转换器抽象类 转炉混凝土等级 我想实现这样的目标(这是我需要帮助的地方): 该服务看起来如下所示:

  • 问题内容: 我正在寻找使用Python给出最佳实践,设计模式和SOLID原理示例的任何资源。 问题答案: 这些重叠 Python中级和高级软件木工 像Pythonista一样的代码:惯用的Python Python成语与效率 Google美国开发人员日-Python设计模式 另一个资源是Python食谱中的示例。很多人没有遵循最佳实践,但是您可以在其中找到一些有用的模式

  • 创造模式处理一个对象的创建。创造模式的目的是为了在不按照约定而直接地创建的地方提供可选择的情况。

  • 状态模式(state pattern)是一个面向对象设计模式。该模式的关键在于一个值有某些内部状态,体现为一系列的 状态对象,同时值的行为随着其内部状态而改变。状态对象共享功能 —— 当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象代表负责其自身的行为和当需要改变为另一个状态时的规则的状态。持有任何一个这种状态对象的值对于不同状态的行为以及何时状态转移毫不知情。 使