我正在测试Codepen Demo作为分布式计算框架的可行性。看起来它似乎可行,但我想知道如何设置给定筒仓中活动谷物的最大数量?
我的谷物不会纯粹受CPU限制,并会执行一些IO和其他相关任务。我担心如果我让它狂奔,它会激活大量的实例,这会使整个事情陷入困境。
这样的筒仓配置是否可能?
答案 0 :(得分:4)
奥尔良非常适合非CPU工作。 Orleans grain旨在使用Task<T>
进行异步而不是线程,因此您应该始终使用C#的async/await功能执行异步IO。
如果您绝对需要执行阻止IO,则可以在谷物的SynchronizationContext
之外执行IO,并在谷物中执行await
结果,如下所示:
var result = await Task.StartNew(() => {
// Perform blocking work.
return 43;
}, TaskCreationOptions.LongRunning);
TaskCreationOptions.LongRunning
提示调度程序应该使用新线程。
更好的方法是创建自己的ThreadPool
&amp;该工作的后续TaskScheduler
并将其用于您的IO。
请注意,您应该了解潜在的dangers of Task.StartNew。
答案 1 :(得分:2)
最好将所有阻塞操作卸载到线程池,并将MaxActiveThreads保持为默认值(#cores)。 基本上你永远不想阻止奥尔良线程(那些MaxActiveThreads)。那些奥尔良线程应该做一个轻量级计算并发出外部异步调用(对其他谷物或外部服务)。所有繁重的计算都不应该在Orlean的线程上完成。
您可以这样做并仍然保持单线程执行保证。 见这里:http://dotnet.github.io/orleans/Advanced-Concepts/External-Tasks-and-Grains
答案 2 :(得分:0)