【问题标题】:C#: Farm out jobs to worker processes on a multi-processor machineC#:将作业分配给多处理器机器上的工作进程
【发布时间】:2010-06-15 10:07:42
【问题描述】:

我有一个需要在 ca 上运行的通用检查。 1000 个对象。检查大约需要 3 秒。我们有一个有 4 个处理器的服务器(我们的网络中还有其他多处理器服务器),所以我们想创建一个 exe / dll 来进行检查并将结果返回给“master”。

有谁知道这方面的框架,或者如何在 C# 中实现它?

具体来说:

  • 在主进程和工作进程之间传输数据的最佳方式是什么?
  • 主进程如何确保在任何时候始终有 4 个进程在运行,并且在工作进程完成后立即启动一个新进程。
  • 如何注册工作人员已完成并将其结果附加到列表中?

希望它足够清楚,但很高兴澄清。
A.

一些说明
* 在进程的调用和返回之外实际上没有进程间的通信 e.g.

ResultObject = WorkerProcess(HeresYourDataSonDoSomethingWithIt); * 最初一台机器是必须的,但进一步考虑,我们可能会遇到一些情况,即我们有 6000 个对象要检查,我们希望将其分流到多台服务器,因此我们希望从以下方面做出正确的设计选择一开始,或者至少不为一个服务器开发一个必须为多个服务器完全重写的解决方案。 谢谢!

【问题讨论】:

    标签: c# process queue mapreduce


    【解决方案1】:

    在 C# 中的进程之间传输数据的最佳方式是使用 .NET 远程处理。由于机器在同一个网络上,您可以使用二进制序列化和 IPC 通道,它们应该非常快。 您不需要服务器机器上的 4 个进程,只需要多个线程。如果使用 .NET 4.0,请查看 parallel extensions,如果您不熟悉多线程以及随之而来的陷阱,那可以大大简化您的代码。

    此外,这对于您的需求可能有点过头了,但您可以查看来自 Microsoft Research Labs 的 DryadLINQ

    【讨论】:

    • WCF 支持跨进程通信,.NET 远程处理是旧方式。
    【解决方案2】:

    如果您必须使用单独的进程,您可能需要考虑定义所有任务并将它们放入一个队列。 MSMQ 和 SQL Server 是两种选择。

    然后让每个进程从队列中拉出一个任务,直到队列为空。

    使用四个处理器,您可以简单地启动四个轮询进程并将每个关联分配给特定的 CPU。

    【讨论】:

    • 我建议不要提供亲和力 - 让操作系统来处理。
    • @Adam:我同意,但 OP 询问如何确保所有四个处理器都在使用中......
    • 是的。但是,如果工作足够繁重,并且服务器没有运行其他任何东西,这将自然发生。如果操作系统正在运行其他东西并且强制关联,它可能会饿死其他进程 - 这就是我说“建议”的原因:)
    • +1 用于 MSMQ,完全支持这种情况的框架 - 但有消息大小限制。
    • 不确定我们是否“必须”使用单独的进程,但我们对大量对象有相同的工作要做。使用所有 4 个处理器并不重要。服务器将专用于该任务。
    【解决方案3】:

    看看内置的ThreadPool。您可以为线程池排队一个“工作项”。 .NET 将管理线程,根据需要启动新线程并确保“空闲”线程得到新的工作。此外,线程池应在 CPU 之间平均分配工作。

    【讨论】:

    • OP 提到其他服务器可能会参与,单靠线程在网络上是不够的。
    【解决方案4】:

    您更关心的应该是可靠性。如果您使用工作进程而不是线程,尤其是当这些进程在其他机器上运行时,失败的几率会显着增加。这种故障可能很难处理,很难从因未处理的异常或有人绊倒电源线而死的进程中恢复。

    避免采用使代码显着复杂但可能永远不会真正使用的架构。当您使用线程时,这将更容易。从长远来看,这仍然可以扩展,多核 CPU 是未来。

    WCF 是正确使用的技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多