Jeśli mam wątek w nieskończonej pętli, czy istnieje sposób zakończenia go, gdy kończy się główny program (na przykład, kiedy naciskam ctrl+C
)?python: jak zakończyć wątek, gdy kończy się główny program
Odpowiedz
Sprawdź to pytanie. Prawidłowa odpowiedź ma wielki wyjaśnienie, w jaki sposób zakończyć wątki właściwej drodze: Is there any way to kill a Thread in Python?
Aby ogranicznik wątek na klawiaturze sygnał przerwania (Ctrl + C) można złapać wyjątek „KeyboardInterrupt” i porządki przed wyjściem. Tak:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
W ten sposób można kontrolować, co zrobić, gdy program zostanie nagle przerwane.
Można również użyć wbudowanego modułu sygnałowego, który pozwala konfiguracji obsługi sygnałów (w konkretnym przypadku sygnału SIGINT): http://docs.python.org/library/signal.html
Jeśli dokonać pracownik podaje wątki demon, umrą gdy wszyscy twoi wątki inne niż demony (np. główny wątek) zostały zakończone.
http://docs.python.org/library/threading.html#threading.Thread.daemon
Dzięki za prostą i precyzyjną odpowiedź, domyślne wątkowanie. Status demona 'isDaemon()' jest fałszywy, ustaw go jako True przez 'setDaemon (True)'. – Tony
To odpowiada na pytanie i po prostu działa. Operacja nie zapytała, jak ogólnie wyłączyć wątki. –
Użyj moduł biblioteki standardowej Pythona atexit zarejestrować funkcji „zakończenie”, które się nazywa (w głównym wątku) na wszelkie możliwe „czystej” zakończenia głównego wątku, w tym nieprzechwycony wyjątkiem takich jak KeyboardInterrupt
. Takie funkcje zakończenia mogą (choć nieuchronnie w głównym wątku!) Wywoływać dowolną wymaganą funkcję stop
; wraz z możliwością ustawienia wątku jako daemon
, który zapewnia narzędzia do prawidłowego projektowania funkcjonalności systemu, której potrzebujesz.
Należy zauważyć, że to podejście zadziałało bez potrzeby demonizowania wątków w wersjach Pythona wcześniejszych niż 2.6.5, zobacz odpowiedź na http://stackoverflow.com/questions/3713360/python-2-6-x-theading-signals-atexit-fail- w niektórych wersjach. To niefortunne IMHO, ponieważ wątki demona podczas zamykania są trochę bałaganem przed pythonem 3.4 (http://bugs.python.org/issue19466). Jeśli zatrzymasz _i_ dołączenie do wątków demona w twoich atexitowych programach obsługi, wszystko powinno być w porządku, przy (prawdopodobnie nieznacznym) koszcie uszeregowania twojej oderwanej nici. – NeilenMarais
Jeśli odradzasz wątek taki jak ten - myThread = Thread(target = function)
- a następnie wykonaj myThread.start(); myThread.join()
. Po uruchomieniu CTRL-C wątek główny nie wychodzi, ponieważ oczekuje na to wywołanie blokujące myThread.join()
. Aby to naprawić, po prostu ustaw limit czasu dla wywołania .join(). Limit czasu może być tak długi, jak chcesz. Jeśli chcesz czekać w nieskończoność, po prostu ustaw się naprawdę długo, np. 99999. Dobrą praktyką jest też wykonywanie myThread.daemon = True
, tak aby wszystkie wątki kończyły się po wyjściu głównego wątku (nie-demona).
'myThread.daemon = True' jest wspaniałym rozwiązaniem tego problemu. – Brannon
@Brannon '.daemon = True' nie jest rozwiązaniem trwałym. Sprawdź ten wątek, aby uzyskać wyjaśnienie: https://stackoverflow.com/a/20598791/5562492 –
- 1. Wywołanie metody, gdy wątek kończy się
- 2. Jak mogę się upewnić, że główny wątek kończy się po zakończeniu wszystkich pozostałych wątków?
- 3. Co dzieje się z innymi wątkami, gdy główny wątek wywołuje sys.exit()?
- 4. iOS AudioSessionSetActive() blokuje główny wątek?
- 5. AudioServicesPlaySystemSound i główny wątek
- 6. Jak sprawić, aby Qt działało, gdy główny wątek jest zajęty?
- 7. timera zawiesza wątek główny
- 8. jak zakończyć wątek spania w pthread?
- 9. Ile sposobów może zakończyć się program java?
- 10. Jak mogę całkowicie zakończyć wątek Lua?
- 11. Jak zakończyć wątek w C++ 11?
- 12. NSFileManager removeItemAtPath blokuje główny wątek
- 13. Czy NSURLConnection blokuje główny wątek?
- 14. NSThread sleepfortimeinterval blokuje główny wątek
- 15. Przewijanie UICollectionView blokuje główny wątek
- 16. Wątek Python uruchamia się przed wywołaniem Thread.start
- 17. python unittest assertRaises wyrzuca wyjątek, gdy assertRaises kończy się niepowodzeniem
- 18. Jak poprawnie zakończyć wątek roboczy w wstrzykniętej bibliotece DLL?
- 19. Wykonany program PHP kończy się niepowodzeniem.
- 20. Program Java kończy się wynikiem java: 137
- 21. CLR kończy pracę, gdy wątek zostanie nieobsługiwany. Wyjątek
- 22. Dlaczego ten prosty program Akka Streams nigdy się nie kończy?
- 23. co się dzieje, gdy wątek wyrzuca wyjątek?
- 24. Podczas gdy pętla kończy się przedwcześnie
- 25. Opis SIGCHLD, gdy proces potomny kończy się
- 26. Kiedy wyłączyć główny wątek, jak mogę jak najszybciej uruchomić kod główny wątku?
- 27. Jak zakończyć lub zawiesić wątek Rust z innego wątku?
- 28. Dlaczego funkcja WaitForMultipleObjects kończy się niepowodzeniem z wieloma uchwytami wątków?
- 29. spraw, aby główny program czekał na zakończenie wątków.
- 30. NativeActivity nie kończy się
Bardzo dziękuję za odpowiedź. Być może nie odpowiedziałem poprawnie na pytanie. W przykładzie podanym w tym pytaniu nadal konieczne było wykonanie funkcji stop() dla wątku. Kiedy nieprawidłowo kończę program przez ctrl + C, to nie może się zdarzyć. Tak, moje pytanie brzmi trochę jak: "jak wywołać funkcję mythread.stop(), jeśli główny wątek został przerwany" – facha
Edytowałem moje pytanie :) – rogeriopvl
Jak jeszcze nikt nie zauważył średnika w twoim przykładzie kodu? Uwielbiam to! –