在多个谷物之间分配繁重的工作(Microsoft Orleans)
Distribute heavy work between multiple grains (Microsoft Orleans)
我想使用 Orleans 在不同的粒度上并行计算一个简单的可并行计算(例如 Mandelbrot),并在粒度完成后将结果合并回一起。但是,我不确定该怎么做,或者 Orleans 是否是解决此类问题的正确框架。
另外让我提一下,这不会是任何将投入生产的项目,我只是在玩 Orleans。
到目前为止,这是我的想法:
我有一个 graintype(我们称它为 "maingrain"),它是客户端的入口点(也可能是 grain)。然后这个 grain 估计所需的处理能力并将任务分成更小的部分,这些部分分配给来自另一个 graintype 的其他 grain(我将这些称为 "subgrains")。让这些 subgrains 完成工作并等待可以返回给客户端的结果没什么大不了的,但是我不确定如何处理 subgrains。
比方说,有一个调用我想使用 10 个子颗粒。我通过一个新的 GUID 获取每个并让它们工作。他们完成了,客户得到了结果。
现在有一个我想使用 X 亚晶粒的调用:
- 我应该简单地用 X 个新的 GUID 激活 X 个新的子晶粒,然后让垃圾收集器进行清理吗?
- 我是否应该以某种方式重用之前激活的 subgrain(某种池化),我怎么知道 subgrain 已经可以重用(=不忙)?
- 如果我想使用多个 maingrains 会发生什么。每个都处理它自己的亚晶粒吗?
你会怎么做?谢谢。
您可以使用 Orleans.Concurrency.StatelessWorkerAttribute 将亚晶标记为 "StatelessWorker"。当队列中有消息积压时,这将自动扩展 grain(创建相同 grain 的多个实例),从而允许并行处理这些子任务。
发现关于无国籍工人这很有趣:http://encloudify.blogspot.co.uk/2014/05/grains-grains-and-more-grains.html
我想使用 Orleans 在不同的粒度上并行计算一个简单的可并行计算(例如 Mandelbrot),并在粒度完成后将结果合并回一起。但是,我不确定该怎么做,或者 Orleans 是否是解决此类问题的正确框架。 另外让我提一下,这不会是任何将投入生产的项目,我只是在玩 Orleans。
到目前为止,这是我的想法: 我有一个 graintype(我们称它为 "maingrain"),它是客户端的入口点(也可能是 grain)。然后这个 grain 估计所需的处理能力并将任务分成更小的部分,这些部分分配给来自另一个 graintype 的其他 grain(我将这些称为 "subgrains")。让这些 subgrains 完成工作并等待可以返回给客户端的结果没什么大不了的,但是我不确定如何处理 subgrains。
比方说,有一个调用我想使用 10 个子颗粒。我通过一个新的 GUID 获取每个并让它们工作。他们完成了,客户得到了结果。 现在有一个我想使用 X 亚晶粒的调用:
- 我应该简单地用 X 个新的 GUID 激活 X 个新的子晶粒,然后让垃圾收集器进行清理吗?
- 我是否应该以某种方式重用之前激活的 subgrain(某种池化),我怎么知道 subgrain 已经可以重用(=不忙)?
- 如果我想使用多个 maingrains 会发生什么。每个都处理它自己的亚晶粒吗?
你会怎么做?谢谢。
您可以使用 Orleans.Concurrency.StatelessWorkerAttribute 将亚晶标记为 "StatelessWorker"。当队列中有消息积压时,这将自动扩展 grain(创建相同 grain 的多个实例),从而允许并行处理这些子任务。
发现关于无国籍工人这很有趣:http://encloudify.blogspot.co.uk/2014/05/grains-grains-and-more-grains.html