내가 병렬 처리해야하는 특정 항목의 일정한 흐름을 가지고 있으므로 TPL Dataflow
을 사용하고 있습니다. catch와 같은 키를 공유하는 항목 (사전과 유사)은 FIFO 순서로 처리되어야하며 서로 평행하지 않아야합니다 (서로 다른 값을 가진 다른 항목과 병렬이 될 수 있음). 작업이 진행되고해쉬 된/Sharded ActionBlocks
내 솔루션은 더 병렬 처리 Environment.ProcessorCount
의 ActionBlock<T>
의 크기의 배열을 생성하고 키의 GetHashCode
값에 따라 그들에 게시했다 그래서 최소한의 비동기 잠금 장치와 결합 된 매우 CPU입니다.
창조 :
_actionBlocks = new ActionBlock<Item>[Environment.ProcessorCount];
for (int i = 0; i < _actionBlocks.Length; i++)
{
_actionBlocks[i] = new ActionBlock<Item>(_ => ProcessItemAsync(_));
}
사용법 :
그래서bool ProcessItem(Key key, Item item)
{
var actionBlock = _actionBlocks[(uint)key.GetHashCode() % _actionBlocks.Length];
return actionBlock.Post(item);
}
, 내 질문은,이 내 문제에 대한 최선의 해결책인가? 성능/확장성에 문제가 있습니까? 내가 놓친 게 있니?
나는 그것을 좋아한다. 나는 저장을 필요로하지 않을 다른 방법을 생각할 수 없다. 나는 당신이 해쉬 코드가 적절히 배포되었는지를 확인하는 한, 이것은 괜찮을 것이라고 생각한다. – spender
'GetHashCode'의 값에 의존하는 것은 나에게 아주 이상하게 들립니다. 왜 그걸 가지고 있습니까? 실제 요구 사항 "동등한 항목을 FIFO 순서로 처리해야합니까?" – svick
@svick 같은 키를 가진 항목은 사전을 사용하는 것과 비슷한 FIFO 순서로 처리되어야합니다 (실제로는 같은 항목 유형 일 필요는 없습니다). 나는 그것을 명확하게하기 위해 질문을 업데이트 할 것이다. – i3arnon