【问题标题】:How to design handling of requests using multiple threads in Delphi?如何在 Delphi 中设计使用多线程处理请求?
【发布时间】:2013-06-28 09:16:17
【问题描述】:

我是多线程应用程序架构和设计的新手。

如何设计以下案例,如果有任何设计模式,那就更好了。

我们需要设计一个可以做以下事情的windows服务。

SQL Server 数据库有两个表,称为组织和事件表,分别保存组织列表和该组织中发生的事件列表。

Windows 服务需要异步处理每个组织的事件。 Windows 服务从组织表中读取组织列表并为每个组织创建一个线程。每个组织线程每 2 秒轮询一次事件表,将事件读入事件列表。当事件列表中放置/可用的东西并且调度程序对象创建并运行事件处理程序线程来处理这些事件中的每一个时,必须调用另一个对象(调度程序)。一旦事件被处理,事件处理线程应该被终止。

可以有多个事件源,将事件放在事件列表中。

使用 Delphi 2009 和 SQL Server 2008 Express 版本。

请帮忙。

【问题讨论】:

  • 如果他们所做的只是轮询,为什么需要这么多“组织”线程?恕我直言,一个投票线程就足够了。
  • 我也会考虑提供一种在插入事件时“通知”服务的方法:通过 IPC 或 TCP 或 UDP 或 HTTP 或命名管道或邮槽、COM+、MSMQ...跨度>

标签: sql-server delphi windows-services


【解决方案1】:

为什么要为每个组织创建一个主题?我能想到的唯一原因是您希望能够为每个组织配置不同的轮询时间。否则,我将只有一个轮询线程来获取自上次轮询以来的所有事件并处理这些事件。

为了处理事件,你可以使用一个队列和一个工作池来处理它们(看看OmnithreadLibrary,所以处理事件(这可能很耗时,我不知道),可以多线程。

如果您愿意,您可以确保每个组织只同时处理一个事件,尽管您应该怀疑这是否有意义。

所以,我会:

  • 1 个轮询线程来获取新事件并将它们放入队列中。
  • 1 个队列用于处理这些事件。
  • 处理队列的工作人员数量不限,最好基于 cpu 核心数量而不是组织数量。

如果您需要在整个组织中进行事件消息传递,您可能还想看看像 RabbitMQ 这样的工具。获取事件并立即将它们放入 RabbitMQ 可能是个好主意,之后该工具可以分发它们。

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2021-04-09
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多