C#:将作业分配到多处理器计算机上的工作进程

时间:2010-06-15 10:07:42

标签: c# process queue mapreduce

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

有没有人知道这个的框架,或者如何在C#中使用它?

具体做法是:

  • 在主服务器和工作进程之间传输数据的最佳方法是什么?
  • 主人如何确保任何时候总是有4个进程在运行,并且只要工作进程完成就会启动一个新进程。
  • 如何注册工作人员已完成并将其结果附加到列表中?

希望它足够清楚,但很乐意澄清 甲

一些澄清
*实际上在通话和回程之外没有进程间通信,例如

     ResultObject = WorkerProcess(HeresYourDataSonDoSomethingWithIt);
*最初一台机器是必须的,但是想到更远的路线,我们可能会遇到一些情况,我们要检查6000个对象,我们希望将它移植到多个服务器上,所以我们希望从中做出正确的设计选择。一开始,或者至少不为一台服务器开发一个必须完全重写多个服务器的解决方案。 谢谢!

4 个答案:

答案 0 :(得分:3)

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

此外,这可能对您的需求有些过分,但您可以从Microsoft研究实验室查看DryadLINQ

答案 1 :(得分:2)

如果您必须使用单独的流程,您可能需要考虑定义所有任务并将其置于队列中。 MSMQ和SQL Server有两种选择。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

避免提交一个使代码复杂化但可能永远不会被实际使用的架构。使用线程时,这将更容易 。从长远来看,这仍然可以扩展,许多核心CPU都是未来。

WCF是正确使用的技术。