كيفية إيقاف عملية بيثون الفرعية التي تقوم بتشغيل اختبارات الوحدة على الفور?إنهاء وقتل لا يعمل

StackOverflow https://stackoverflow.com/questions/3302910

سؤال

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

myProcess = subprocess.Popen(['python', '-u', 'runTests.py'],  
                         stdout=subprocess.PIPE, 
                         stderr=subprocess.STDOUT)

الملف runTests.py يقوم ببعض الإعداد ثم يقوم بتشغيل ملف اختبار وحدة باستخدام الأمر التالي:

execfile('myUnitTests.py')

الملف myUnitTests.py لديه العديد من اختبارات الوحدة التي يستغرق تشغيلها أكثر من خمس دقائق.من واجهة المستخدم الرسومية ، انقر فوق زر لإيقاف تشغيل الاختبارات.وهذا بدوره يجعل مؤشر ترابط العامل يرسل إشارة لإيقاف العملية الفرعية:

myProcess.terminate()

الأمر إنهاء لا يتوقف العملية على الفور, ينتظر حتى انتهاء اختبار الوحدة الحالية تشغيل ومن ثم إنهاء العملية?لقد حاولت استخدام os.kill ولكن أحصل على نفس النتائج كما هو الحال مع terminate().

أي فكرة عن كيف يمكنني جعل برنامجي أكثر استجابة بحيث تقتل عملية فرعية على الفور?

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

المحلول

وثائق بايثون [ http://docs.python.org/library/signal.html ] يقول:

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

حتى إذا كان لديك اختبار وحدة لمدة خمس دقائق تقوم به "عملية حسابية طويلة نفذت بحتة في ج", و تقوم وحدة اختبار الوحدة الخاصة بك بتثبيت معالج لـ SIGTERM, ، هذه مشكلتك.إذا كان الأمر كذلك ، حاول myProcess.kill بدلا من myProcess.terminate (أو ، إذا لم يكن لديك 2.6, myProcess.send_signal(9)). SIGKILL لا يمكن مشاهدته من مساحة المستخدم ويجب أن يكون له تأثير فوري.

تحذير:لن يتم تنفيذ أي إجراءات تنظيف من المفترض أن تعمل على الطريق للخروج من إطار اختبار الوحدة الخاصة بك.

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