Sonsuz döngüde bir iş parçacığım varsa, ana program sona erdiğinde onu sonlandırmanın bir yolu var mı (örneğin, Ctrl+ düğmesine bastığımda C)?
Yanıtlar:
Bu soruyu kontrol edin. Doğru cevap, iş parçacıklarının doğru şekilde nasıl sonlandırılacağına dair harika bir açıklamaya sahiptir: Python'da bir İş Parçacığını öldürmenin herhangi bir yolu var mı?
İş parçacığını Keyboard Interrupt sinyalinde (ctrl + c) durdurmak için "KeyboardInterrupt" istisnasını yakalayabilir ve çıkmadan önce temizleyebilirsiniz. Bunun gibi:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
Bu şekilde, program aniden sonlandırıldığında ne yapacağınızı kontrol edebilirsiniz.
Ayrıca, sinyal işleyicileri (sizin özel durumunuzda SIGINT sinyali) kurmanıza izin veren yerleşik sinyal modülünü de kullanabilirsiniz: http://docs.python.org/library/signal.html
cleanup_stop_thread()
ı kullanabileceği bir küresel işlev? yoksa uygulamam mı gerekiyor?
Çalışan iş parçacıklarınızı daemon evreleri oluşturursanız, tüm arka plan programı olmayan evreleriniz (örneğin ana iş parçacığı) çıkıldığında ölürler.
http://docs.python.org/library/threading.html#threading.Thread.daemon
isDaemon()
False, tarafından True olarak ayarlayın setDaemon(True)
.
isDaemon()
ve setDaemon()
(bağlı doküman yukarıdaki gibi), kullanımdan hemen eski alıcılar / ayarlayıcıları olarak daemon=True
içindethreading.Thread()
Alt iş parçacığını daemon iş parçacığı olarak etkinleştirmeyi deneyin.
Önerilen:
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()
Çizgide:
t = Thread(target=<your-method>, daemon=True).start()
Eski API:
t.setDaemon(True)
t.start()
Ana iş parçacığınız sona erdiğinde ("yani Ctrl+ düğmesine bastığımda C"), diğer iş parçacıkları da yukarıdaki talimatlar tarafından öldürülür.
Kullanım atexit gibi yakalanmamış istisna olmak üzere ana iş parçacığı herhangi makul "temiz" feshi hakkında (ana iş parçacığı üzerinde) denilen olsun "sonlandırma" fonksiyonlarını kaydetmek için Python'ın standart kütüphanenin modülü KeyboardInterrupt
. Bu tür sonlandırma işlevleri (kaçınılmaz olarak ana iş parçacığında!) İstediğiniz herhangi bir stop
işlevi çağırabilir ; daemon
ihtiyaç duyduğunuz sistem işlevselliğini doğru bir şekilde tasarlamanız için gerekli araçları sağlayan bir iş parçacığı ayarlama olasılığı ile birlikte .
atexit.register()
Python modüllerindeki post-poned çağrılar nedeniyle tuhaf şeyler olabileceğinin farkında olun , bu da sonlandırma prosedürünüzün prosedüründen sonra yürütülmesine neden olur multiprocessing
. Bu sorunla Queue
ve daemon
iş parçacıklarıyla uğraşıyorum : Çoklu işlem Kuyruğu ve İş Parçacığı kullanılarak program çıkışında "EOF hatası" .
atexit
işleyiciler, arka plan programı olmayan iş parçacıkları canlı olduğunda ve ana iş parçacığı çıktığında çağrılmaz. Konuları sonlandırmak için atexit kullanılırken çıkışta komut dosyası takılı kaldı bölümüne bakın .
Böyle bir İplik üretirseniz - myThread = Thread(target = function)
- ve sonra yapın myThread.start(); myThread.join()
. CTRL-C başlatıldığında, ana iş parçacığı bu engelleme myThread.join()
çağrısını beklediği için çıkmaz . Bunu düzeltmek için, .join () çağrısına bir zaman aşımı koyun. Zaman aşımı istediğiniz kadar uzun olabilir. Süresiz olarak beklemesini istiyorsanız, 99999 gibi gerçekten uzun bir zaman aşımı süresi koyun. myThread.daemon = True
Ana iş parçacığı (arka plan programı olmayan) çıktığında tüm iş parçacıklarının çıkması da iyi bir uygulamadır .
myThread.daemon = True
bu soruna harika bir çözüm.
.daemon=True
sağlam bir çözümde değil. Açıklama için bu konuyu kontrol edin: stackoverflow.com/a/20598791/5562492
Daemon iş parçacıkları nezaketsizce öldürülür, böylece herhangi bir sonlandırıcı talimatı çalıştırılmaz. Olası bir çözüm, ana iş parçacığının sonsuz döngü yerine canlı olup olmadığını kontrol etmektir.
Örneğin Python 3 için:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()
Bkz . Ana İş Parçacığının başka bir ileti dizisinden hala canlı olup olmadığını kontrol edin .