C# 在多种谷物之间分配繁重的工作(微软奥尔良)

C# 在多种谷物之间分配繁重的工作(微软奥尔良),c#,actor,distributed-computing,orleans,C#,Actor,Distributed Computing,Orleans,我想计算一个简单的并行计算(例如Mandelbrot),奥尔良在不同的颗粒上进行并行计算,并在颗粒完成后将结果合并在一起。然而,我不知道如何做到这一点,或者奥尔良是否是解决这类问题的正确框架。 还让我提一下,这将不会是任何项目,将投入生产,我只是玩弄奥尔良 到目前为止,我的想法如下: 我有一个graintype(我们称之为“maingricle”),它是客户端的入口点(也可能是一个grain)。然后,这个粒度估计所需的处理能力,并将任务分成更小的部分,这些部分从另一个粒度类型分配给其他粒度(我将

我想计算一个简单的并行计算(例如Mandelbrot),奥尔良在不同的颗粒上进行并行计算,并在颗粒完成后将结果合并在一起。然而,我不知道如何做到这一点,或者奥尔良是否是解决这类问题的正确框架。 还让我提一下,这将不会是任何项目,将投入生产,我只是玩弄奥尔良

到目前为止,我的想法如下: 我有一个graintype(我们称之为“maingricle”),它是客户端的入口点(也可能是一个grain)。然后,这个粒度估计所需的处理能力,并将任务分成更小的部分,这些部分从另一个粒度类型分配给其他粒度(我将这些称为“子粒度”)。让这些子颗粒完成工作并等待结果返回给客户没有什么大不了的,但是我不确定如何处理这些子颗粒

比方说,有一个调用,我想使用10个子颗粒。我通过一个新的GUID来获取每个GUID,并让它们工作。完成后,客户机将得到结果。 现在有一个调用,我想使用X子颗粒:

  • 我应该简单地用X个新的guid激活X个新的子颗粒,并让垃圾收集器进行清理吗
  • 我是否应该以某种方式重用以前激活的子粒度(某种类型的池),如何知道子粒度已经可重用(=不忙)
  • 如果我想使用多个主颗粒,会发生什么。每个都处理自己的子颗粒吗

你会怎么做?谢谢。

您可以使用Orleans.Concurrency.StatelessWorkerAttribute将子粒度标记为“无状态工作者”。当队列中有积压的消息时,这将自动扩展粒度(创建同一粒度的多个实例),从而允许并行处理这些子任务


发现关于无国籍工人的这一点非常有趣:

…这听起来正是我想要的。我实现了整个场景,运行单个思洛存储器的效果与预期一样。但是,在多台PC上运行多个思洛存储器并没有带来我所希望的速度提高(使用2个思洛存储器进行了测试)。不确定我的实现是否有问题。我会在周末做更多的测试,如果我有新的见解,我会回到这里。同样,计算对于相当大的mandelbrot图像(大于4000x2000px)也不起作用-但是,不确定我的实现是问题还是其他问题。这是一个正确的答案。