문제

병렬로 처리해야 하는 특정 항목의 지속적인 흐름이 있으므로 다음을 사용하고 있습니다. TPL Dataflow.문제는 동일한 키(사전과 유사)를 공유하는 항목은 FIFO 순서로 처리되어야 하며 서로 평행하지 않아야 한다는 것입니다(다른 값을 가진 다른 항목과 평행할 수 있음).

수행 중인 작업은 최소한의 비동기 잠금을 사용하여 CPU에 바인딩되어 있으므로 내 솔루션은 다음과 같은 배열을 만드는 것이었습니다. ActionBlock<T>크기는 Environment.ProcessorCount 병렬 처리 없이 키에 따라 게시합니다. GetHashCode 값.

창조:

_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);
}

그래서 내 질문은 이것이 내 문제에 대한 최선의 해결책인가입니다.성능/확장성이 저하되고 있나요?뭔가 빠졌나요?

도움이 되었습니까?

해결책

해시 코드가 잘 배포될 것이라는 것을 알고 있다고 가정하면 귀하의 접근 방식이 합리적이라고 생각합니다.

잘못된 배포에 대해 더 나은 보호를 원할 경우 더 많은 수의 배포를 사용할 수 있습니다. ActionBlock단일 사용자 정의를 사용하여 총 동시성 수준을 제한하는 동시에 TaskScheduler 모든 블록에서 공유됩니다.그러한 스케줄러를 찾을 수 있습니다 ParallelExtensionsExtras에서 또는 MSDN에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top