Omnithreadlibrary - waitforexit


معظم الوقت يعمل كمطور يعطي لنا حرية الفوضى في عالمنا على مستوى عال من التجريد، ولكن في بعض الأحيان الواقع ركلات كنت في أجزاء خاصة ويخبرك أن تجد الرجل الذي يفهم حقا. إيف كان مجرد واحدة من تلك التجارب. أعتقد أنه يكفي لإدراج البيانات الزاوية كقائمة بند بالنسبة لك لفهم ما لدينا هنا: Win2008 خادم 64Bit البيئة وف التطبيق المستخدم من قبل العديد من العملاء في وقت واحد التطبيق هو قاذفة، الذي يفتح تطبيقات أخرى باستخدام Process. Start () أحيانا نحن الحصول على استثناء المدرجة أدناه تحرير 1 بعد بعض التفتيش، هيريس مزيد من التفاصيل: إطلاق هو عملية 2-خطوة، قاذفة تطلق نافذة وسيطة باستخدام Process. WaitForExit () من نافذة وسيطة، ويمكن بدء عمليات أخرى بنفس الطريقة (Process. WaitForExit). فقط مع نافذة وسيطة مفتوحة وأي تفاعل المستخدم، عمليات قاذفة عدد من مقابض يزيد مع مرور الوقت. الحد الأقصى لزيادة رأينا هنا هو 400 - 6000 مقابض. الحقائق المضافة في تحرير حقا تجعلني أتساءل عما إذا كان قد يكون هناك تسرب مقبض في الإطار في مكان ما. إيم محاولة لعزل المشكلة وتحقق ما إذا كان يمكنني إعادة إنتاجه من الصفر. في هذه الأثناء، يتم قبول أي نوع من التلميح، فكرة، دعم أو حتى الشوكولاته بكل سرور إديت 2. في محاولة لجعل العملية تستجيب ل بوستساج (). قمنا بإزالة the. WaitForExit. بدلا من ذلك، أضفنا معالج لحدث العمليات التي تم الخروج منها وأرسلت قاذفة إلى حلقة مثل ما يلي: مجموعة معالجات الخروج فو إلى فالس ولا يفعل أي شيء آخر. ومع ذلك، فإن عدد مقابض يرتفع (400-800 في نصف ساعة). إديت 3 هنا يأتي شيء مثير للاهتمام، في الماضي. هذا يبقيه الطريقة المفترض أن يكون، عدد قليل من مقابض، كل أنيق. الآن أن يجعلني أتساءل ما الخطأ هنا. سوء الحديث مع المطور المسؤول مرة أخرى للتحقق مرة أخرى ماذا يفعل قاذفة. حتى الآن، سمعت أنه يقرأ بعض القيم التكوين باستخدام XmlDocument. Load (). والتي ليست غير قابلة للتلف - يجعل من الصعب إنتاج أي تسرب هنا. وسأل 10 10 10 في 10: 25 عمليات متعددة المراحل مع أومنيثرادليبراري وحدة أوتلباراليل في أومنيثرادليبراري يقدم بعض الحلول رفيعة المستوى التي تسمح لك لتشغيل بعض أنواع العمليات بشكل متواز بسهولة. حتى الآن أنها تدعم حسابات الخلفية بذاتها (parallel. Future)، العمليات المتوازية المستقلة (Parallel. Join) وحسابات حلقة حيث مهمة الخلفية عديمي الجنسية (أي أنه يعتمد فقط على المدخلات 8211 قيمة حلقة 8211 وليس على الحسابات القيام به على المدخلات الأخرى 8211 قيمة حلقة parallel. ForEach). ولكن الكثير من الوقت عمليات don8217t تقع في أي من تلك الفئات. اقترح ماسون ويلر مؤخرا إضافة دعم لعمليات متعددة المراحل. خلال عطلة نهاية الأسبوع I8217ve تنفيذها في أومنيثرادليبراري والآن هذه الميزة جاهزة لك لبدء الاختبار. شكرا كبيرا ل ماسون لاقتراحه وأيضا للعمل على تنفيذ وتصميم باراليال. Pipeline قدم حديثا. الافتراض هو أن العملية يمكن تقسيمها إلى مراحل (أو سوبروسيسس)، متصلة طوابير البيانات. تدفق البيانات من (اختياري) طابور المدخلات في المرحلة الأولى، حيث يتم معالجتها جزئيا ومن ثم تنبعث في طابور وسيط. المرحلة الأولى ثم يستمر التنفيذ، عمليات المزيد من البيانات المدخلات والمخرجات المزيد من البيانات الانتاج. يستمر هذا إلى أن تتم معالجة الإدخال الكامل. الطابور الوسيطة يؤدي إلى المرحلة التالية التي لا معالجة بطريقة مماثلة وهلم جرا وهلم جرا. في النهاية، يتم إخراج البيانات إلى قائمة انتظار والتي يمكن بعد ذلك قراءة ومعالجة من قبل البرنامج الذي أنشأ هذه العملية متعددة المراحل. ككل، عملية متعددة المراحل وظائف كما يأتي خط أنابيب 8211 البيانات، ويخرج البيانات (ومعجزة يحدث في ما بين). ما هو مهم هنا هو أنه لا توجد أسهم المرحلة حالة مع أي مرحلة أخرى. ويتم التفاعل الوحيد بين المراحل مع البيانات التي تم تمريرها من خلال طوابير الوسيط. ومع ذلك، يجب أن تكون كمية البيانات ثابتة. فمن الممكن تماما للمرحلة لتوليد بيانات أكثر أو أقل مما تلقته على المدخلات. في برنامج ترابط واحد كلاسيكي خطة التنفيذ لعملية متعددة المراحل بسيطة جدا. في بيئة متعددة مؤشرات، ومع ذلك، يمكننا أن نفعل أفضل من ذلك. لأن المراحل مستقلة إلى حد كبير، يمكن تنفيذها على التوازي. إعداد المهام وطوابير وسيطة هو بسيط إلى حد ما 8211 ولكن بعيدا عن تافهة عملية 8211. ولذلك سيكون من الأفضل إذا كان يمكن أن يكون آليا بطريقة أو بأخرى. كانت تلك هي الفكرة العامة التي جاء ميسون لي مع وجنبا إلى جنب قمنا بتصميم جزء جديد من أومنيثرادليبراري 8211 Parallel. Pipeline. موازية. الخط أنابيب يتم إنشاء خط أنابيب عن طريق استدعاء وظيفة موازية. Pipeline الذي يعود واجهة إومنيبيبلين. هناك نوعان من الإصدارات الزائدة 8211 واحد لبناء خط أنابيب العام وآخر لخطوط الأنابيب البسيطة التي don8217t تتطلب أي تكوين خاص. النسخة الأخيرة يأخذ معلمتين 8211 صفيف من مراحل المعالجة وطابور المدخلات اختياري. يمكن استخدام طابور الإدخال لتوفير البيانات الأولية إلى المرحلة الأولى. كما أنها صالحة تماما لتمرير 8216nil8217 لمعلمة طابور المدخلات وتشغيل المرحلة الأولى دون أي مدخلات. يتم استخدام مجموعات حظر البيانات في الطابور في تنفيذ بالتوازي. Pipeline. ويتم تنفيذ المراحل كإجراءات أو إجراءات أو أساليب مجهولة الهوية تأخذ معلمتين في قائمة الانتظار 8211 واحدة للإدخال وواحدة للإخراج. باستثناء المرحلة الأولى حيث قد لا يتم تعريف قائمة انتظار الإدخال، يتم إنشاء كلاهما تلقائيا بواسطة تنفيذ خط الأنابيب ويتم تمريرها إلى مندوب المرحلة. يظهر جزء التعليمات البرمجية التالي وظيفة خط أنابيب بسيطة في العمل. يؤخذ من اختبار أومنيثرادليبراري 41Pipeline. موازية. بيبلين يقبل مجموعة من المندوبين المرحلة ويعود واجهة إومنيبيبلين. ثم يتم تشغيل تشغيل على واجهة لإعداد البنية التحتية، بدء جميع المهام وإرجاع طابور الإخراج. وينتظر البرنامج الرئيسي للمرحلة الأخيرة لإنتاج نتيجة ولأنه يعلم أنه سيكون هناك قيمة واحدة تنتج بالضبط يمكن أن تنتظر لذلك عن طريق استدعاء الدالة التالي (الذي تم تنفيذه مؤخرا أيضا هو مجرد مجمع بسيط حول وظيفة خذ) . وعادة ما يتم الوصول إلى السلطة الكاملة للواجهة إومنيبيبلين من خلال وظيفة باراليترليس. يحدد الإدخال قائمة انتظار الإدخال. إذا لم يتم استدعاؤه، لن يتم تعيين قائمة انتظار الإدخال وسوف تتلقى المرحلة الأولى لا شيء لمعلمة الإدخال. المرحلة يضيف مرحلة خط أنابيب واحدة. مراحل يضيف مراحل الأنابيب متعددة. يحدد نومتاسكس عدد مهام التنفيذ الموازية للمرحلة (المراحل) التي تمت إضافتها فقط مع الدالة ستيج (s) (إيو، كال ستيج تليها نومتاسكس للقيام بذلك). إذا تم استدعاؤه قبل إضافة أي مرحلة، فإنه سيتم تحديد الافتراضي لجميع المراحل. يمكن بعد ذلك تجاوز عدد مهام التنفيذ الموازية لمرحلة معينة من خلال استدعاء نومتاسكس بعد استدعاء المرحلة. اقرأ المزيد عن التنفيذ المتوازي في القسم المراحل الموازية أدناه. خنق يحدد المعلمات اختناق للمرحلة (ق) المضافة فقط مع وظيفة (ق) المرحلة. تماما كما نومتاسك أنه يؤثر على الافتراضات العالمية أو مجرد المضافة حاليا المرحلة (ق). افتراضيا، يتم تعيين الاختناق إلى عناصر 10240. راجع قسم الاختناق أدناه للحصول على مزيد من المعلومات. تشغيل يفعل كل العمل الشاق 8211 يخلق طوابير ويضع أومنيثرادليبراري المهام. فإنه يعود قائمة انتظار الإخراج والتي يمكن استخدامها بعد ذلك في البرنامج الخاص بك لتلقي نتيجة الحساب. حتى إذا كانت المرحلة الأخيرة لا تنتج 8217t أي نتيجة هذا الطابور يمكن استخدامها للإشارة إلى نهاية الحساب. عند انتهاء كل مرحلة، يتم استدعاء كومبليتادينغ تلقائيا على قائمة انتظار الإخراج. وهذا يسمح للمرحلة التالية للكشف عن نهاية المدخلات (حجب جمع العداد الخروج أو تريتاك سيعود كاذبة). ينطبق الأمر نفسه على قائمة انتظار الإخراج. مثال (مأخوذ أيضا من 41Pipeline) سيساعد على تفسير كل هذا. أولا، يتم تعيين معلمة اختناق عالمية. وسيتم تطبيقه على جميع المراحل. ثم تتم إضافة مرحلتين، كل منهما مع مكالمة منفصلة لوظيفة المرحلة. ثم يتم إضافة مرحلتين أخرى مع مكالمة واحدة. يتم تعيين كلاهما لتنفيذ في مهمتين متوازيتين. في النهاية يتم إضافة مرحلة أخرى ويتم تنفيذ الإعداد بأكمله. ستستخدم العملية الكاملة سبع مهام (واحدة ل ستاجيجينيرات، واحدة ل StageMult2، اثنان ل StageMinus3: اثنان ل StageMod5 وواحدة ل ستاجيسوم). مولداتور، موتاتورس، وملخصات Let8217s نلقي نظرة على ثلاثة أمثلة مختلفة من مراحل المعالجة متعددة قبل أن تأخذ منعطفا للمياه العميقة. المثال الأول هو مثال على المرحلة الأولى التي تقبل أي مدخلات وتولد فقط الناتج الذي تم تمريره إلى المرحلة التالية في السلسلة. (يتم أخذ جميع الأمثلة مرة أخرى من 41Pipeline.) المثال الثاني يقرأ البيانات من المدخلات ولكل مدخلات يولد وينقل قيمة الانتاج واحد. المثال الأخير يقرأ البيانات من الإدخال، ويضيف كل القيم معا وينتج قيمة ملخص واحد فقط. جميع الأمثلة هي مجرد حالات خاصة من المبدأ العام 8211 هناك 8217s لا علاقة المطلوبة بين كمية البيانات المدخلات وكمية بيانات الانتاج. هناك أيضا 8217s أي شرط أن البيانات يجب أن تكون جميع الأرقام. لا تتردد في تمرير حول أي شيء يمكن أن تكون موجودة في تومنيفالو. اختناق في بلدي حالة الاختبار (41Pipeline) يتم تمرير كمية كبيرة من البيانات (مليون أرقام) من خلال عملية متعددة المراحل. إذا تم تعليق مؤشر ترابط واحد لبعض الوقت 8211 أو إذا كان يقوم بإجراء عملية حساب أبطأ من مؤشر الترابط السابق 8211 قد تملأ قائمة انتظار الإدخال هذا الموضوع 8217s مع البيانات التي يمكن أن تتسبب في تخصيص الكثير من الذاكرة ثم إصدارها لاحقا. حتى تدفق البيانات، يستخدم خط أنابيب الاختناق. وظيفة جديدة في جمع حجب. يضبط الاختناق الحجم الأقصى (في وحدات تومنيفالو) من مجموعة الحجب. عندما يتم تخزين المبلغ المحدد من عناصر البيانات في المجموعة، لا يمكن إضافة المزيد من البيانات. سيتم منع الدالة أد ببساطة حتى تكون المجموعة فارغة بما فيه الكفاية مرة أخرى أو تم استدعاء كومبليتادينغ. وتعتبر المجموعة فارغة بما فيه الكفاية عندما ينخفض ​​عدد البيانات دون بعض القيمة التي يمكن تمريرها كمعلمة ثانية لوظيفة الخانق أو يتم حسابها على أنها 34 من الحد الأقصى للحجم إذا لم يتم توفير المعلمة الثانية. مراحل متوازية عادة، يتم بدء مهمة واحدة لكل مرحلة في خط الأنابيب. وفي بعض الحالات المتخصصة، قد يكون من المستصوب تشغيل أكثر من مهمة موازية لكل مرحلة. وقدم مثال على ذلك في طريقة btnExtended2Click أعلاه. يمكن تمثيل خط الأنابيب الذي تم إنشاؤه في هذا المثال مع الرسم البياني التالي. كما ترون، هناك 8217s دائما طابور واحد فقط يجلس بين مراحل حتى لو كانت هناك وحدات معالجة متعددة للمرحلة. يتم إنجاز ذلك بسهولة من قبل إومنيبلوكينغكولكتيون دعم القراء متعددة والكتاب متعددة بطريقة ثريديساف. هناك 8217s تحذيرا هاما، على الرغم من. إذا قمت بتقسيم مرحلة إلى مهام متعددة، فستتم معالجة البيانات بترتيب غير محدد. لا يمكنك معرفة عدد العناصر التي سيتم معالجتها من قبل كل مهمة والتي سيتم معالجتها. حتى أسوأ من ذلك سوف 8211 البيانات إنهاء مرحلة تعدد المهام في ترتيب غير محدد (إخراج البيانات من مهمة واحدة سوف تكون معشق مع البيانات من مهمة أخرى). اعتبارا من هذه اللحظة هناك 8217s بأي حال من الأحوال لفرض ترتيب الأصلي كما يتم ذلك في تنفيذ بالتوازي. فوريش. اكتمل أم لا على الرغم من أن Parallel. Pipeline قد ارتكبت وجاهزة للاختبار، فإنها قد تكون لا تزال بعض المراوغات في التعليمات البرمجية. I8217ll اتبع هذا مع وظيفة أو اثنين على الاختبار والأداء وكنت قد ترغب في الانتظار حتى ذلك الحين قبل البدء في استخدامه. إذا كنت ترغب في مساعدتي مع التنمية، ثم الرجاء المضي قدما، واستخدامه والإبلاغ عن أي مشاكل يعود لي، إما هنا في التعليقات أو في المنتدى.

Comments