بيثون: كيفية إنهاء موضوع عند انتهاء البرنامج الرئيسي

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

سؤال

إذا كان لديّ موضوع في حلقة لا حصر لها ، فهل هناك طريقة لإنهائه عند انتهاء البرنامج الرئيسي (على سبيل المثال ، عندما أضغط كنترول+ج)?

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

المحلول

تحقق من هذا السؤال. الإجابة الصحيحة لها شرح رائع حول كيفية إنهاء المواضيع بالطريقة الصحيحة:هل هناك أي طريقة لقتل خيط في بيثون؟

لجعل مؤشر الترابط يتوقف على إشارة مقاطعة لوحة المفاتيح (CTRL+C) يمكنك التقاط استثناء "لوحة المفاتيح" والتنظيف قبل الخروج. مثله:

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()

وبهذه الطريقة يمكنك التحكم في ما يجب القيام به كلما تم إنهاء البرنامج فجأة.

يمكنك أيضًا استخدام وحدة الإشارة المدمجة التي تتيح لك إعداد معالجات الإشارات (في حالتك المحددة ، إشارة sigint): http://docs.python.org/library/signal.html

نصائح أخرى

إذا قمت بتجميع خيوط Daemon Threads للعامل ، فسوف تموت عندما يتم خروج جميع خيوطك غير Daemon (على سبيل المثال الخيط الرئيسي).

http://docs.python.org/library/threading.html#threading.thread.daemon

استخدم ال atexit وحدة من مكتبة Python القياسية لتسجيل وظائف "الإنهاء" التي يتم استدعاؤها (على الخيط الرئيسي) في أي إنهاء "نظيف" بشكل معقول للخيط الرئيسي ، بما في ذلك استثناء غير معطل مثل KeyboardInterrupt. قد تكون وظائف الإنهاء هذه (على الرغم من أنه حتما في الخيط الرئيسي!) استدعاء أي stop الوظيفة التي تحتاجها ؛ جنبا إلى جنب مع إمكانية تعيين موضوع daemon, ، يمنحك هذا الأدوات اللازمة لتصميم وظائف النظام التي تحتاجها بشكل صحيح.

إذا كنت تفرخ خيط مثل ذلك - myThread = Thread(target = function) - ثم افعل myThread.start(); myThread.join(). عند بدء تشغيل CTRL-C ، لا يخرج الخيط الرئيسي لأنه ينتظر هذا الحظر myThread.join() يتصل. لإصلاح هذا ، ببساطة وضع مهلة على مكالمة. join (). يمكن أن تكون المهلة طالما رغبت في ذلك. إذا كنت تريد أن تنتظر إلى أجل غير مسمى ، فما عليك سوى وضع فترة طويلة حقًا ، مثل 99999. من الممارسات الجيدة أيضًا القيام بها myThread.daemon = True لذلك يخرج جميع المواضيع عندما يخرج الخيط الرئيسي (غير Daemon).

جرب مع تمكين الخيوط الفرعية كخطو.

علي سبيل المثال:

from threading import Thread

threaded = Thread(target=<your-method>)
threaded.daemon = True  # This thread dies when main thread (only non-daemon thread) exits.
threaded.start()

أو (في الخط):

from threading import Thread

threaded = Thread(target=<your-method>, daemon=True).start()

عندما ينتهي موضوعك الرئيسي ("على سبيل المثال ، عندما أضغط كنترول+ج") أن المواضيع الأخرى تقتل مع التعليمات أعلاه.

تُقتل خيوط الخفيون بشكل غير متكافئ حتى لا يتم تنفيذ أي تعليمات نهائية. الحل المحتمل هو التحقق من أن الخيط الرئيسي هو على قيد الحياة بدلاً من حلقة لا حصر لها.

على سبيل المثال لبيثون 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()

يرى تحقق مما إذا كان الخيط الرئيسي لا يزال على قيد الحياة من موضوع آخر.

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