كتل العمل المجزأة/المجزأة
-
21-12-2019 - |
سؤال
لدي تدفق مستمر لبعض العناصر التي أحتاج إلى معالجتها بالتوازي لذلك أستخدمها 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
s مع الحد من إجمالي مستوى التزامن باستخدام مخصص واحد TaskScheduler
مشتركة بين جميع الكتل.يمكنك العثور على مثل هذا المجدول في الامتدادات المتوازية أو على MSDN.