【问题标题】:How to program a connection pool?如何编写连接池?
【发布时间】:2010-05-07 18:53:25
【问题描述】:

是否存在用于实现连接池的已知算法?如果不是,什么是已知的算法,它们的权衡是什么?
设计和编程连接池时常见的设计模式有哪些?
有没有使用 boost.asio 实现连接池的代码示例?
使用连接池来持久连接(不是 http)是个好主意吗?
线程与连接池有什么关系?什么时候需要新线程?

【问题讨论】:

  • 一次一个问题是很好的做法。
  • 它们都是相关的,您是否希望我针对这些相关问题中的每一个问题轰炸stackoverflow?
  • 我认为问题在于您的问题让人们认为您没有对该主题进行任何研究并且您想要所有答案(类似于“家庭作业”问题)。虽然这不是一种无效的提问方式,但在我看来,这让人们参与起来并不容易。
  • 我在谷歌搜索并阅读了维基百科的文章。如果您有任何资源,我也想提供资源链接。我还没有找到很多。

标签: c++ design-patterns boost-asio


【解决方案1】:

如果您正在寻找纯线程池策略(可能是连接或任何资源),有两种简单的方法,即:-

  1. 半同步/半异步模型(通常使用消息队列来传递信息)。

  2. Leaders/Followers 模型(通常使用请求队列来传递信息)。

第一种方法是这样的:-

  • 您创建一个线程池以 处理资源。通常这个尺寸 (线程数)需要是 可配置。调用这些线程 '工人'。
  • 然后创建一个主线程 将工作分派给 Worker 线程。应用程序将 task 作为 向主线程发送消息
  • 主线程将相同的 所选 Worker 的消息 Q 线程和 Worker 线程从 水池。选择和删除 Worker 线程需要同步。
  • Worker 完成后 任务,它返回到线程池。

主线程本身可以以FCFS优先化 的方式使用它获得的任务。这将取决于您的实施。

第二个模型(领导者/追随者)是这样的:-

  • 创建线程池。最初所有 是工人。然后选出一个 Leader,自动休息,全部成为追随者。注意选 Leader 必须同步。
  • 将所有要处理的数据放在一个 单个请求 Q
  • 线程池 Leader 出列 任务。然后它立即 选出新的领导者并开始执行任务。
  • 新领导接下一个 任务。

可能还有其他方法,但上面列出的方法很简单,适用于大多数用例。

半同步/半异步主要弱点:-

  • 更高的上下文切换, 同步和数据复制 开销。

领导者/追随者的主要弱点:-

  • 实施复杂性 Leader在线程池中选举。

现在您可以自己决定更正确的方法。 高温,

【讨论】:

  • 这真的很有帮助。我非常感谢你。第二种方法听起来很有趣,但是如何选择领导者呢?它是可用的线程对象吗?如果池中没有可用线程怎么办?当前的领导者应该执行任务并等待另一个线程可用,还是应该保持其领导者的角色?连接池基本上是一些线程的集合吗?它应该是一个向量吗?一个列表?一套?在这种方法中,我将如何完成需要完成的任务(由客户发送)?领导是否对此负责?
  • 在收到这些常见模式的名称后,我在谷歌上搜索并发现:kircher-schwanninger.de/michael/publications/lf.pdf 我会仔细阅读它,它看起来很有趣。
  • @the_drow:领导者只是另一个线程,但它必须承担任务。总是必须有一个领导者,如果池中的所有线程都忙,那么任务必须在请求 Q 中等待新领导者被选举。一旦有领导者,它将负责这项任务。同样,该请求 Q 可以是 FCFS 或基于优先级的。您找到的链接确实不错,您可以考虑那里提供的方法。
  • @the_drow:请参阅cs.wustl.edu/~schmidt/PDF/lf-PLOPD.pdf 了解 ACE 如何实现它。
猜你喜欢
  • 1970-01-01
  • 2021-11-30
  • 2015-11-01
  • 2014-07-29
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多