[英]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
來限制其總並發級別。 您可以在ParallelExtensionsExtras或MSDN上找到此類調度程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.