我有一些需要並行處理的某些項目的不斷流,所以我正在使用TPL Dataflow
。值得注意的是共享相同鍵(與詞典類似)的項目應該按照先進先出的順序進行處理,而不是彼此平行(它們可以與具有不同值的其他項目平行)。散列/分片動作塊
正在開展的工作是非常CPU以最小的異步鎖的束縛,所以我的解決方案是創建ActionBlock<T>
S的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);
}
所以,我的問題是,這是我的問題的最佳解決方案?我傷害了性能/可伸縮性嗎?我錯過了什麼嗎?
我喜歡它。我想不出另一種不需要存儲的方法。我認爲只要你確定你的散列碼是正確分佈的,這應該沒問題。 – spender
依賴於'GetHashCode'的值聽起來對我來說很奇怪,你爲什麼擁有它?實際需求是否「應該按先進先出順序處理相同的項目」? – svick
@svick更像是具有相同密鑰的項目應該按照先進先出順序進行處理,這與您使用字典的方式類似(並不一定是相同的項目類型)。我會更新這個問題,使其更清楚。 – i3arnon