ถ้าฉันมีเธรดในการวนซ้ำแบบไม่มีที่สิ้นสุดจะมีวิธียุติเธรดเมื่อโปรแกรมหลักสิ้นสุดลงหรือไม่ (เช่นเมื่อฉันกดCtrl+ C)
ถ้าฉันมีเธรดในการวนซ้ำแบบไม่มีที่สิ้นสุดจะมีวิธียุติเธรดเมื่อโปรแกรมหลักสิ้นสุดลงหรือไม่ (เช่นเมื่อฉันกดCtrl+ C)
คำตอบ:
ตรวจสอบคำถามนี้ คำตอบที่ถูกต้องมีคำอธิบายที่ดีในการยุติเธรดอย่างถูกวิธี: มีวิธีใดในการฆ่าเธรดใน Python หรือไม่?
เพื่อให้เธรดหยุดบนสัญญาณ Keyboard Interrupt (ctrl + c) คุณสามารถตรวจจับข้อยกเว้น "KeyboardInterrupt" และล้างข้อมูลก่อนออกได้ แบบนี้:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
ด้วยวิธีนี้คุณสามารถควบคุมสิ่งที่ต้องทำเมื่อใดก็ตามที่โปรแกรมถูกยกเลิกทันที
คุณยังสามารถใช้โมดูลสัญญาณในตัวที่ให้คุณตั้งค่าตัวจัดการสัญญาณ (ในกรณีเฉพาะของคุณคือสัญญาณ SIGINT): http://docs.python.org/library/signal.html
cleanup_stop_thread()
ฟังก์ชั่นระดับโลกที่ฉันสามารถใช้? หรือฉันควรจะใช้มัน?
หากคุณสร้างเธรด daemon เธรดผู้ปฏิบัติงานของคุณเธรดจะตายเมื่อเธรดที่ไม่ใช่ daemon ทั้งหมดของคุณออกจากเธรดหลัก (เช่นเธรดหลัก)
http://docs.python.org/library/threading.html#threading.Thread.daemon
isDaemon()
คือ False setDaemon(True)
ตั้งทรูโดย
isDaemon()
และsetDaemon()
เป็น getters / setters เก่า (ตามเอกสารที่เชื่อมโยงด้านบน) เพียงใช้daemon=True
ในthreading.Thread()
ลองเปิดใช้งานเธรดย่อยเป็น daemon-thread
แนะนำ:
from threading import Thread
t = Thread(target=<your-method>)
t.daemon = True # This thread dies when main thread (only non-daemon thread) exits.
t.start()
อินไลน์:
t = Thread(target=<your-method>, daemon=True).start()
API เก่า:
t.setDaemon(True)
t.start()
เมื่อเธรดหลักของคุณสิ้นสุด ("เช่นเมื่อฉันกดCtrl+ C") เธรดอื่น ๆ จะถูกฆ่าโดยคำแนะนำข้างต้น
ใช้โมดูลatexitของไลบรารีมาตรฐานของ Python เพื่อลงทะเบียนฟังก์ชัน "การสิ้นสุด" ที่เรียก (บนเธรดหลัก) ในการยุติเธรดหลักที่ "สะอาด" อย่างสมเหตุสมผลรวมถึงข้อยกเว้นที่ไม่ถูกจับเช่นKeyboardInterrupt
. ฟังก์ชันการสิ้นสุดดังกล่าวอาจ (แม้ว่าจะหลีกเลี่ยงไม่ได้ในเธรดหลัก!) เรียกใช้stop
ฟังก์ชันใด ๆ ที่คุณต้องการ พร้อมกับความเป็นไปได้ในการตั้งเธรดเป็นdaemon
ซึ่งจะช่วยให้คุณมีเครื่องมือในการออกแบบฟังก์ชันการทำงานของระบบที่คุณต้องการ
atexit.register()
โทรที่โพสต์ในโมดูล Python ทำให้ขั้นตอนการยกเลิกของคุณถูกดำเนินการหลังจากขั้นตอนmultiprocessing
หนึ่ง ผมทำงานในปัญหานี้จัดการกับQueue
และdaemon
หัวข้อ: ข้อผิดพลาด“EOF” ที่ออกจากโปรแกรมโดยใช้ multiprocessing คิวและด้าย
atexit
จัดการจะไม่ถูกเรียกเมื่อเธรดที่ไม่ใช่ daemon ยังมีชีวิตอยู่และเธรดหลักจะออก ดูสคริปต์ติดอยู่บนทางออกเมื่อใช้ atexit จะยุติหัวข้อ
หากคุณวางไข่กระทู้เช่นดังนั้น - myThread = Thread(target = function)
- myThread.start(); myThread.join()
แล้วทำ เมื่อ CTRL-C เริ่มต้นเธรดหลักจะไม่ออกเนื่องจากกำลังรอการmyThread.join()
โทรที่บล็อกนั้น ในการแก้ไขปัญหานี้เพียงแค่ใส่การหมดเวลาในการโทร. เข้าร่วม () การหมดเวลาอาจนานเท่าที่คุณต้องการ หากคุณต้องการให้รออย่างไม่มีกำหนดให้ใส่ช่วงหมดเวลาที่ยาวนานจริงๆเช่น 99999 วิธีปฏิบัติที่ดีคือmyThread.daemon = True
ให้เธรดทั้งหมดออกเมื่อเธรดหลัก (ที่ไม่ใช่ดีมอน) ออก
myThread.daemon = True
เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับปัญหานี้
.daemon=True
ไม่ใช่ทางออกที่มั่นคง ดูคำอธิบายในเธรดนี้: stackoverflow.com/a/20598791/5562492
เธรด Daemon ถูกฆ่าอย่างไม่สมศักดิ์ศรีดังนั้นคำสั่ง Finalizer จะไม่ถูกดำเนินการ วิธีแก้ไขที่เป็นไปได้คือการตรวจสอบว่าเธรดหลักยังมีชีวิตอยู่แทนที่จะเป็นลูปที่ไม่มีที่สิ้นสุด
เช่น Python 3:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()