W dokumentacji Pythona napisano:
Wątek można oznaczyć jako „wątek demona”. Znaczenie tej flagi polega na tym, że cały program Python kończy działanie, gdy pozostaną tylko wątki demona. Wartość początkowa jest dziedziczona z wątku tworzącego.
Czy ktoś ma jaśniejsze wyjaśnienie tego, co to oznacza, lub praktyczny przykład pokazujący, gdzie należy ustawić wątki daemonic
?
Wyjaśnij to dla mnie: więc jedyną sytuacją, w której nie ustawiłeś wątków daemonic
, jest sytuacja, w której chcesz, aby kontynuowały działanie po wyjściu z głównego wątku?
źródło
None
takim przypadku zwraca , ale nie ma znaczenia, wartość zwracana nie jest używana.Załóżmy, że tworzysz rodzaj widżetu na pulpicie nawigacyjnym. W ramach tego chcesz wyświetlać liczbę nieprzeczytanych wiadomości w skrzynce e-mail. Więc tworzysz mały wątek, który:
Gdy widget się uruchomi, utworzy ten wątek, wyznaczy go jako demona i uruchomi. Ponieważ jest to demon, nie musisz o tym myśleć; po wyjściu widgetu wątek zatrzyma się automatycznie.
źródło
Inne plakaty podały kilka przykładów sytuacji, w których można użyć wątków demona. Jednak zalecam, aby nigdy ich nie używać.
Nie dlatego, że nie są użyteczne, ale dlatego, że przy ich użyciu mogą wystąpić złe skutki uboczne. Wątki demona mogą nadal być wykonywane po tym, jak środowisko wykonawcze Python zacznie niszczyć rzeczy w głównym wątku, powodując dość dziwne wyjątki.
Więcej informacji tutaj:
https://joeshaw.org/python-daemon-threads-consanted-harmful/
https://mail.python.org/pipermail/python-list/2005-Feb February/343697.html
Ściśle mówiąc, nigdy ich nie potrzebujesz, w niektórych przypadkach po prostu ułatwia wdrożenie.
źródło
logging
i spodziewałem się, że po zakończeniu wątku wszystkie obiekty (deskryptory plików dla każdego wątku / funkcji) zostaną zniszczone. Pod koniec mojego programu widziałem wiele takich wynikówIOError: [Errno 24] Too many open files:
. Zlsof -p pid_of_program
odkryłem, że FDS były otwarte, nawet trudna jest Temat / Funkcje zakończeniu pracy. Obejście? Usuwanie modułu obsługi dziennika na końcu funkcji.daemonic
Nici więc nie są godne zaufania ...Być może jest to prostszy sposób: po powrocie main proces nie zakończy się, jeśli nadal działają wątki niebędące demonami.
Mała rada: czyste zamknięcie jest łatwe do popełnienia błędu, gdy w grę wchodzą wątki i synchronizacja - jeśli możesz tego uniknąć, zrób to. W miarę możliwości używaj wątków demona.
źródło
Chris wyjaśnił już, czym są wątki demonów, więc porozmawiajmy o praktycznym użyciu. Wiele implementacji pul wątków używa wątków demonów dla pracowników zadań. Pracownicy to wątki, które wykonują zadania z kolejki zadań.
Pracownik musi bez końca czekać na zadania w kolejce zadań, ponieważ nie wie, kiedy pojawi się nowe zadanie. Wątek, który przypisuje zadania (powiedz główny wątek) wie tylko, kiedy zadania się skończyły. Główny wątek czeka w kolejce zadań na opróżnienie, a następnie kończy działanie. Jeśli pracownicy są wątkami użytkownika, tzn. Nie są demonami, program się nie zakończy. Będzie czekał na tych nieskończenie działających pracowników, nawet jeśli pracownicy nie robią nic pożytecznego. Oznacz wątki demonów pracowników, a wątek główny zajmie się ich zabiciem, gdy tylko zakończy wykonywanie zadań.
źródło
Cytując Chrisa: „... kiedy twój program się kończy, wszelkie wątki demonów są automatycznie zabijane.”. Myślę, że to podsumowuje. Powinieneś być ostrożny, gdy ich używasz, ponieważ nagle kończą się, gdy główny program wykonuje się do końca.
źródło
Gdy drugi wątek nie jest demonem, główny główny wątek aplikacji nie może wyjść, ponieważ jego kryteria wyjścia są powiązane z wyjściem również wątków innych niż demony. Wątki nie mogą być przymusowo zabijane w pythonie, dlatego Twoja aplikacja będzie musiała naprawdę czekać na zakończenie wątków nie-demona. Jeśli takie zachowanie nie jest tym, czego chcesz, ustaw drugi wątek jako demon, aby nie powstrzymywał Twojej aplikacji przed zamknięciem.
źródło