Tel*_*ian 1 c# distributed-computing cluster-computing orleans
在Microsoft Orleans中,我尝试使用以下代码实现类似可用工作的列表:
public Task<WorkResponse> PerformWork(WorkRequest request)
{
Console.WriteLine("Performing work for id: {0}", request.Param1);
Thread.Sleep(TimeSpan.FromSeconds(10));
var result = Task.FromResult(new WorkResponse(request.Param1, request.Param2, request.Param3));
Console.WriteLine("Completed work for id: {0}", request.Param1);
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用像这样的代码启动许多任务,那么事情就不会正常.
_work
.ToList()
.AsParallel()
.ForAll(x =>
{
Console.WriteLine("Requesting work for id: {0}", x.Key);
var worker = GrainFactory.GetGrain<IWork>(x.Key);
var response = worker.PerformWork(x.Value);
Console.WriteLine("Response for work id: {0}", x.Key);
});
Run Code Online (Sandbox Code Playgroud)
但是,如果另一个节点加入群集,则工作似乎永远不会移动到新节点.仅在该新节点上处理新计划的工作.
似乎如果奥尔良队列中有一堆额外的工作,那么新节点就会加入群集.
Orleans使用固定数量的工作线程来最小化上下文切换和线程的开销.呼叫Thread.Sleep()会带来麻烦,因为工作人员将忙着睡觉以从队列中拉出新工作.
当你避免Thread.Sleep(...)和使用时会发生什么await Task.Delay(...).
奥尔良使用的成员算法要求筒仓具有响应性:慢筒仓与死亡筒仓无法区分.
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |