我有一个c#多线程蒙特卡罗模拟,应用程序已经被构造成可以被划分为独立执行的任务,TaskController执行任务,聚合中间结果,检查收敛性(早期终止条件),然后返回最终结果,这是目前使用ThreadPool实现的。
我想利用不止一台计算机来帮助这个计算。我没有使用IIS的批准或基础设施(这是不会更改的策略),但我可以使用WCF和NetTcpBinding端点绑定,我已经在服务器上测试了这种通信,它具有适当的权限和工作能力。
首先,我认为有一个主exe (控制台应用程序)和其他服务器上的几个奴隶作为专门的工作人员(这些应该是前人吗?或者windows服务?),最终我可以让这个设置在上运行--在空闲时间(或者当屏幕保护程序处于活动状态时),公司内的数百个工作站(以及服务器)。
我可以自己写,但我要处理沟通,1,2路?早期终止(中间会聚结果检查),取消不再需要的任务,部署工作,发现部署工作的可用和就绪的机器,如果工作站不再空闲,则停止/暂停工作?其他在分布式系统中的东西?
主(任务控制器)应该知道所有从工作者的地址(ip)并告诉他们工作(如果他们可用的话),还是当他们能够这样做的时候,奴隶工作者应该只知道主地址并请求工作,还是通信应该双向流动?这将在24小时时钟上运行,每天大约9次运行,以支持不同的业务区域。
我正在寻找关于、.net、网格/分布式库的建议,这些建议可以在这方面提供帮助和一些体系结构建议。
更新
是否有人使用过以下任何一种方法?
http://www.digipede.net/ (commercial)
http://www.gridbus.org/~alchemi/
http://ngrid.sourceforge.net/
http://www.osl.iu.edu/research/mpi.net/或使用JavaSpaces、.net中的Jini或找到等效的.net技术
http://java.sun.com/developer/technicalArticles/tools/JavaSpaces/
http://www.jini.org谢谢
发布于 2009-08-04 10:39:38
我将研究使用空间建筑进行此操作的可能性。
主程序会将作业写入一个空间(实质上是一个对象存储库)。消费客户端总是在寻找工作,当作业可用时,他们将从空间提取、处理并将结果写回该空间或另一个空间(都在事务下)。您可以将作业标记为属于特定运行的作业,以便对结果进行分组。
这样做的优点是很容易扩展(只需增加更多的消费者)。消费者必须确定他们什么时候可以工作,只需要配置有关空间的信息(如何找到它)。生产者与一组消费者完全脱钩。
因为工作是在事务下处理的,所以如果使用者无法完成工作,该工作将返回到空间,并可由另一个使用者进行处理。
您可以轻松地处理中间结果。生产者从空间中获取结果,并在结果可用时获得中间产物。你可以很容易地取消工作。只需将它们从空间中移除。
你可以很容易地增加更多的生产者。它们只需写入相同的空间,如果作业被适当标记,结果将明确地与生产者联系在一起。
不幸的是,我不确定.Net有哪些框架可用(我来自Java,将使用贾瓦斯帕斯 --这些框架使用动态发现,几乎不需要配置)。但值得在谷歌上搜索。也许(如果这足够强大),您可以编写C#生产者/使用者来与Javaspace基础设施进行接口。
https://stackoverflow.com/questions/1226728
复制相似问题