سؤال

ما هو الفرق بين استخدام موضوع جديد و استخدام الخيط من الخيط المسبح ؟ ما مزايا الأداء هناك و لماذا يجب أن تنظر في استخدام خيط من بركة بدلا من واحد لقد صراحة خلقت ؟ أنا أفكر على وجه التحديد .صافي هنا ، ولكن العامة الأمثلة على ما يرام.

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

المحلول

موضوع تجمع سيوفر فوائد متكررة قصيرة نسبيا العمليات

  • إعادة استخدام المواضيع التي تم بالفعل إنشاؤها بدلا من إنشاء جديدة (عملية مكلفة)
  • اختناق معدل إنشاء مؤشر ترابط عندما يكون هناك موجة من طلبات العمل الجديدة البنود (أعتقد أن هذا هو فقط في .NET framework 3.5)

    • إذا كنت طابور 100 موضوع تجمع المهام ، فإنه سيتم فقط استخدام العديد من المواضيع كما تم بالفعل إنشاؤها لخدمة هذه الطلبات (يقول 10 على سبيل المثال).تجمع مؤشرات الترابط سوف تجعل كثرة الشيكات (وأعتقد أن كل 500ms في 3.5 SP1) و إذا كان هناك مهام في قائمة الانتظار ، فإنه سوف تجعل واحد موضوع جديد.إن المهام الخاصة بك سريعة ، ثم عدد المواضيع الجديدة سوف تكون صغيرة و إعادة استخدام 10 أو حتى المواضيع القصيرة المهام سوف يكون أسرع من خلق 100 المواضيع مقدما.

    • إذا كان عبء العمل الخاص بك باستمرار أعداد كبيرة من بركة موضوع الطلبات القادمة ، ثم تجمع مؤشرات الترابط سوف تصل قيمتها نفسها عبء العمل الخاص بك من خلال خلق المزيد من المواضيع في بركة من خلال العملية المذكورة أعلاه بحيث يكون هناك عدد أكبر من الصفحات المتاحة لمعالجة الطلبات

    • تحقق هنا للحصول على مزيد من المعلومات في العمق على كيف تجمع مؤشرات الترابط وظائف تحت غطاء محرك السيارة

إنشاء موضوع جديد يكون أكثر ملاءمة إذا كانت الوظيفة ستكون طويلة نسبيا التشغيل (على الأرجح حوالي سنتين أو الثانية ، ولكن ذلك يعتمد على حالة محددة)

@كرزيستوف موضوع تجمع مؤشرات الترابط الخلفية المواضيع التي سوف تتوقف عند موضوع الرئيسي ينتهي.يدويا إنشاء المواضيع المقدمة بشكل افتراضي (سوف تبقى بعد تشغيل مؤشر الترابط الرئيسي قد انتهت) ، ولكن يمكن تعيين الخلفية قبل بدء الدعوة عليهم.

نصائح أخرى

على .صافي تمكنت threadpool:-

  • أحجام نفسها بناء على حجم العمل الحالي و الأجهزة المتوفرة
  • يحتوي على مؤشرات ترابط worker و إنجاز ميناء المواضيع (التي تستخدم خصيصا لخدمة IO)
  • هو الأمثل لعدد كبير من قصيرة الأجل نسبيا العمليات

الصفحات الأخرى تجمع التطبيقات الموجودة التي قد تكون أكثر ملاءمة عمليات تشغيلها لفترة طويلة.

على وجه التحديد, استخدام الخيط حمام السباحة لمنع التطبيق من خلق الكثير من المواضيع.الميزة الأكثر أهمية من threadpool هو عمل قائمة الانتظار.هذا هو مرة واحدة في الجهاز الخاص بك بما فيه الكفاية مشغول ، threadpool سوف يصطف طلبات بدلا من مباشرة تفرخ المزيد من المواضيع.

لذا ، إذا كنت خلق صغير ، يحدها عدد من المواضيع خلق بنفسك.إذا كنت لا يمكن تحديد ما يصل أمام كم من المواضيع قد يكون إنشاء (على سبيل المثالانهم إنشاؤها استجابة واردة IO) و عملهم سوف تكون قصيرة الأجل ، استخدام threadpool.إذا كنت لا تعرف كم ، ولكن عملهم سوف تكون طويلة الأمد ، لا يوجد شيء في منصة لمساعدتك ولكن قد تكون قادرة على العثور على بديل threadpool التطبيقات التي تناسب.

وكذلك

<اقتباس فقرة>   

وnew Thread().Start()

ويولد موضوع الصدارة التي لن تموت إذا قمت بإغلاق البرنامج. المواضيع ThreadPool هي المواضيع الأساسية التي يموت عند إغلاق التطبيق.

كنت التحف حول نسبة استخدام الموارد لهذه وركض معيارا على 2012 dual-core Intel i5 الكمبيوتر المحمول باستخدام .net 4.0 الإصدار بناء على ويندوز 8.موضوع برك استغرق في المتوسط 0.035 ms أن نبدأ من حيث المواضيع استغرق في المتوسط 5.06 ms.وبعبارة أخرى ترابط في المسبح وبدأت 300x أسرع أعداد كبيرة من عاش قصيرة المواضيع.على الأقل في اختبار مجموعة (100-2000) المواضيع إجمالي الوقت في الموضوع تبدو ثابتة.

هذا هو الرمز الذي تم قياسها:

    for (int i = 0; i < ThreadCount; i++) {
        Task.Run(() => { });
    }

    for (int i = 0; i < ThreadCount; i++) {
        var t = new Thread(() => { });
        t.Start();
    }

enter image description here

وتحقق هنا لموضوع سابق:

متى يجب عدم استخدام ThreadPool في صافي؟

والتعريف غير أن Threadpool أمر جيد إذا كنت بحاجة إلى تفرخ العديد من المواضيع قصير الامد، في حين تستخدم المواضيع يمنحك المزيد من السيطرة قليلا.

والموضوع التخزين المحلي ليست فكرة جيدة مع حمامات الموضوع. أنه يعطي المواضيع على "الهوية". ليست كل المواضيع متساوية بعد الآن. الآن برك موضوع مفيدة خاصة إذا كنت في حاجة الى مجموعة من المواضيع متطابقة، وعلى استعداد للقيام بالعمل دون النفقات العامة الخلق.

إذا كنت في حاجة الى الكثير من المواضيع، وربما كنت ترغب في استخدام ThreadPool. انهم إعادة استخدام المواضيع يوفر لك فوق الخلق الموضوع.

إذا كنت بحاجة فقط موضوع واحد للحصول على القيام بشيء ما، الموضوع هو على الأرجح أسهل.

والحاجة الأساسية لtheadpool المواضيع هي للتعامل مع المهام قصيرة الصغيرة التي من المتوقع أن تكمل على الفور تقريبا. في كثير من الأحيان تشغيل معالجات الأجهزة المقاطعة في سياق التراص والتي لن تكون مناسبة لرمز غير نواة، ولكن الأجهزة المقاطعة معالج قد يكتشف أن وضع المستخدم I / O إكمال الاستدعاء يجب تشغيل في أسرع وقت ممكن. أن خلق ترابط جديد لغرض تشغيل شيء من هذا القبيل تكون مبالغة ضخمة. وجود عدد قليل من المواضيع التي تم إنشاؤها مسبقا والتي يمكن إرسالها إلى تشغيل I / O رد الانتهاء أو أشياء أخرى مماثلة أكثر فاعلية.

وأحد الجوانب الرئيسية لمثل هذه المواضيع هو أنه إذا كنت أساليب إنجاز / O إكمال دائما أساسا على الفور وعدم عرقلة، وعدد من هذه المواضيع التي يتم تشغيلها في الوقت الحاضر مثل هذه الطرق هو على الأقل مساو لعدد من المعالجات، والطريقة الوحيدة يمكن تشغيل أي موضوع آخر قبل إحدى الطرق المذكورة أعلاه أن يكون التشطيبات إذا تجاوز واحدة من الكتل أساليب أخرى أو وقت تنفيذه وطبيعية خيوط الوقت شريحة. أيا من تلك يجب أن يحدث في كثير من الأحيان إذا تم استخدام ترابط التجمع على النحو المنشود.

إذا لا يمكن أن نتوقع للخروج في 100MS أو نحو ذلك من عندما يبدأ تنفيذ طريقة، ينبغي تنفيذ أسلوب عبر بعض وسائل أخرى من ترابط التجمع الرئيسي. إذا كان أحد لديه الكثير من المهام لأداء وحدة المعالجة المركزية التي هي مكثفة ولكن لن تمنع، قد يكون من المفيد لإرسالهم باستخدام مجموعة من المواضيع تطبيق (واحد لكل نواة CPU) وهي منفصلة عن threadpool "الرئيسية"، منذ باستخدام والمزيد من المواضيع من النوى إلى نتائج عكسية عند تشغيل المهام مكثفة وحدة المعالجة المركزية غير مؤمن. إذا، ومع ذلك، فإن طريقة اتخاذ ثانية أو أكثر لتنفيذ، وسوف يقضون معظم وقته المحظورة، يجب المرجح أن تشغيل أسلوب في موضوع مخصص، ويجب يكاد يكون من المؤكد لا يمكن تشغيل في موضوع الرئيسية-threadpool. إذا تحتاج الى عملية مستمرة منذ فترة طويلة ليكون سببها شيء مثل رد I / O، ينبغي للمرء أن تبدأ إما في موضوع العملية المستمرة منذ فترة طويلة في وقت مبكر من رد، وأنها تنتظر على شاشة التي النبضات رد، وإلا وقد رد الاتصال تطلق موضوع جديد لتنفيذ العملية في حين أن مخارج الاستدعاء، تعود بشكل فعال موضوع خاص بها لthreadpool.

في عام (أنا لم تستخدمها .NET)، ستستخدم تجمع مؤشرات ترابط لأغراض إدارة الموارد. انها تسمح القيود ليتم تكوينه في البرنامج. كما يمكن أن يتم لأسباب تتعلق بالأداء، وإنشاء مواضيع جديدة قد يكون مكلفا.

وربما تكون هناك أسباب محددة النظام. في جاوة (مرة أخرى أنا لا أعرف إذا كان هذا ينطبق على .NET)، ومدير المواضيع قد تنطبق المتغيرات المحددة موضوع كما يتم سحب كل موضوع من التجمع، وإلغاء تعيين لهم عندما يتم إرجاع أنها (طريقة شائعة لتمرير شيء من هذا القبيل هوية).

مثال القيد: ليس لدي سوى 10 اتصالات ديسيبل، لذلك أود أن تسمح فقط 10 المواضيع عامل للوصول إلى قاعدة البيانات.

وهذا لا يعني أنه لا ينبغي عليك إنشاء المواضيع الخاصة بك، ولكن هناك الظروف التي من المنطقي أن استخدام حمام السباحة.

وعن طريق بركة هو فكرة جيدة، إذا كنت لا تعرف أو لا يمكن التحكم في عدد موضوع سيتم إنشاء.

ويكون مجرد مسألة مع نموذج باستخدام موضوع لتحديث بعض الحقول من قاعدة بيانات على PositionChanged حدث عنصر تحكم قائمة (تجنب فريز). استغرق الأمر 5 دقائق للمستخدم أن يحصل على خطأ من قاعدة البيانات (عدد كبير جدا بمناسبه الوصول) لأنه كان تغيير موقف القائمة بسرعة كبيرة ...

وأنا أعلم أن هناك طريقة أخرى لحل المشكلة الأساسية (بما في ذلك عدم استخدام الوصول) ولكن تجميع هو بداية جيدة.

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