簡體   English   中英

散列/分片ActionBlocks

[英]Hashed/Sharded ActionBlocks

我需要並行處理某些項目,因此我使用的是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來限制其總並發級別。 您可以在ParallelExtensionsExtrasMSDN上找到此類調度程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM