سؤال

لدي تدفق مستمر لبعض العناصر التي أحتاج إلى معالجتها بالتوازي لذلك أستخدمها 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);
}

لذا، سؤالي هو: هل هذا هو الحل الأفضل لمشكلتي؟هل أضر بالأداء/قابلية التوسع؟هل فاتني شيء؟

هل كانت مفيدة؟

المحلول

أعتقد أن أسلوبك معقول، على افتراض أنك تعرف أنه سيتم توزيع رموز التجزئة بشكل جيد.

إذا كنت ترغب في الحصول على حماية أفضل ضد التوزيعات السيئة، فيمكنك استخدام عدد أكبر من ActionBlocks مع الحد من إجمالي مستوى التزامن باستخدام مخصص واحد TaskScheduler مشتركة بين جميع الكتل.يمكنك العثور على مثل هذا المجدول في الامتدادات المتوازية أو على MSDN.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top