Python Kill Thread

Python Kill Thread

Chociaż nie możemy zabić wątków w Pythonie, istnieje kilka technik, których możemy użyć do symulacji zabijania nici w Pythonie. Zabicie wątku w Pythonie nagle jest uważane za złe podejście do programowania, ponieważ nie możemy bezpośrednio zabić wątku. Zamiast tego musimy użyć jednej z metod dostarczanych przez Pythona. Te metody dokładnie zakończą wątki, ale są one dość blisko procesu.

Tworzenie wątku w Pythonie

Po uruchomieniu programu wątek jest osobnym przepływem wykonania, który działa w tle programu. Wątki Pythona są rodzajem procesu, który może zaplanować ich wykonanie. Mówiąc prosto, proces komputerowy, który komputer będzie przeprowadził. Zestaw instrukcji programu można wykonywać osobno od innych kodów. Wątek tła nie można poprawnie zakończyć w Pythonie, ale istnieją inne techniki, których możemy użyć, jeśli nadal chcemy zakończyć wątek. Metody te nie kończą jednak poprawnie wątku; są raczej bardzo pomocni. Ale tutaj najpierw zademonstrujemy, jak rozpocząć wątek, zanim pokazamy, jak go zatrzymać.

Wykonajmy kod. Najpierw importujemy biblioteki „czasu” i „wątków”. Następnie w poniższym wierszu definiujemy funkcję „FUNC1”. W poniższym wierszu używamy pętli do uruchomienia zmiennej „x” i ustawić zakres dla iteracji wątku. Tutaj ustawiamy zakres od „1” na „10”, co oznacza, że ​​nasz wątek zatrzyma się po „10” iteracjach. W poniższym wierszu nazywamy „czas.sleep () ”z przedziałem czasowym„ 1 ”. Wykorzystaliśmy „czas.Sleep () ”, gdy chcieliśmy opóźnić wykonanie instrukcji.

Następnie nazwaliśmy funkcję print () w tej funkcji. Przed przepuszczeniem przed paleniem minęliśmy zmienną „x”, w której liczba iteracji została przechowywana, a także przekazała instrukcję wejściową, „zakończone iteracje”. Gdy ustawiamy czas na „1”, system przejdzie do trybu uśpienia dla „1” przed wydrukowaniem instrukcji drukowania. Następnie, w następującym wierszu, nazywamy tę funkcję „FUNC” z modułem „wątku”. Tutaj zainicjowaliśmy zmienną „T” do przechowywania wątku. Następnie używamy „t.start () ”, aby uruchomić wątek. I nazywamy funkcją „dołącz ()” z wątkiem metodą „dołącz ()” zawiesza implementację programu, dopóki wątek docelowy nie zostanie odczytany w całości.

Po zakończeniu wątku „10” iteracji system zatrzyma swoją działalność na „1” sekundę przed wydrukowaniem wyrażenia „Zakończone iteracje przed paleniem.„Teraz, kiedy wywołamy funkcję z wątkiem, rozpocznie wykonywanie wątku, gdy ustawimy się nad pętlą, a jej zakres to„ 10 ”.

Teraz, gdy pokazał wszystkie swoje iteracje w wyniku, niemożliwe jest zabicie wątku tutaj. Po kliknięciu Ctrl-C po dowolnej liczbie iteracji wątek będzie działał do momentu zakończenia wszystkich jego iteracji. Ten wątek po prostu rozumie, że musi zakończyć swoje „10” iteracji.

Za pomocą wątku Daemon do zabicia wątku

Teraz nie jesteśmy w stanie zabić wątku za pomocą tej metody. Chociaż możemy powstrzymać wątek przed zakończeniem za pomocą tej metody, po prostu zakończenie wykonania po ustalonej ilości czasu, wątek nie jest zatrzymany w zapleczu. Wątki prowadzące tło, które nieustannie obsługują wątki pierwotne lub nie-daemonowe, biegając na pierwszym planie, są znane jako wątki demon. Wątek demona, który działa w tle, nie powstrzymuje śmierci wątku.

Zacznijmy kod, importowanie trzech bibliotek: „Wątp” jest pierwszym, a następnie odpowiednio „czas” i „sys”. Do zmiany różnych elementów systemu operacyjnego Python można zastosować wiele metod i zmiennych w pakiecie Python Sys. Praca nad tłumaczem jest możliwa dzięki jego dostępności do stałych i metod, które mają ścisłe połączenie z tłumaczem. Po utworzeniu funkcji o nazwie „FUNC” użyliśmy warunku „while” do pracy w warunkach, dopóki instrukcja nie zostanie wykonana w pętli.

Następnie, w następnym wierszu, użyliśmy funkcji „print ()”, aby wydrukować frazę: „Wątek jest aktywny, ale zniknie po zakończeniu programu”, po przekazaniu czasu „1” sekund do „czasu„ czas.Funkcja sleep () ”. Ponieważ użyliśmy „czasu.sleep () ”powyżej, aby ustawić czas na sekundy„ 1 ”, instrukcja wejdzie teraz w tryb uśpienia przez sekundę przed wyprowadzeniem tej metody. Następnie w poniższym wierszu używamy demona i jego właściwości, aby „prawdziwe”, aby umożliwić nam zakończenie naszych wątków po z góry określonym czasie.

Obecnie generujemy wątek, używając „wątku.Wątek ”i używając„ targ = func ”do wywołania funkcji w wątku. Teraz, gdy użyliśmy „t.start () ”, aby rozpocząć nasz wątek, nazywaliśmy„ sys.exit () ”, który spowoduje, że system wyrzuci wyjątek wyjścia systemu. Tak więc ten kod naprawdę robi wyświetlanie instrukcji drukowania zapisanej w funkcji „FUNC”, gdy wątek ją wywołuje, ale opóźnia drukowanie instrukcji o „1” sekundy, ponieważ użyliśmy „czasu.spać()."

Jak widać, wątek obecnie działa, ale kiedy miała zakończyć swoją ósmą iterację, nacisnęliśmy Ctrl-C, co natychmiast zatrzymało zakończenie wątku. Zasadniczo oznacza to, że używając wątku demon. To nie jest najbardziej wydajny sposób na zakończenie wątku; Zamiast tego musimy zakończyć całą operację.

Ponieważ nie można zmusić wątku do zakończenia, przerywając go klawiaturą, teraz używamy obiektu zdarzeń Python w następnym skrypcie. Spowoduje to samodzielne zatrzymanie wątku. Nie musimy trafić żadnych kluczy, aby powstrzymać go przed zakończeniem. Ten obiekt zdarzenia jest oferowany w module wątku. Ma dwie określone metody: set () i not set ().

Zacznijmy od wdrożenia kodu od importowania pakietów „Sygnał”, „Wątka” i „Time”. Następny wiersz używa „Wątka.event () ”, aby wywołać wydarzenie wątku. Następnie, w poniższym wierszu, używamy funkcji print () i wewnątrz niej, wywołujemy instrukcję wejściową, przekazując argument „I z 20 iteracji.„Drukujemy wartość„ i ”w zmiennej„ F ”, która ma„ 20 ”iteracji. Następnie, w poniższym wierszu, używamy pętli i wewnątrz, tworzymy zmienną „i” i ustawiamy zakres na „1” na „20”. Następnie użyliśmy warunku „jeśli”, który jest wyjściem.wydarzenie.jest ustawiony () łamie pętlę, co oznacza, że ​​jeśli zdarzenie jest ustawione (), to kończy się. Używamy funkcji print () do wydrukowania instrukcji, która jest „iteracji zakończona przed wyjściem” i wydrukowania wartości „i” w zmiennej „F”. Użyliśmy warunku „jeśli”, który jest, jeśli wyjście .wydarzenie.jest ustawiony (), a następnie rozbij pętlę.

Następnie utworzyliśmy nową funkcję z nazwą „Handler sygnału”, do której przekazaliśmy zmienne „Signum” i „Ramka”. Po użyciu Exit_Event.set (), nazwaliśmy funkcje „obsługi sygnału” z sygnałem.sygnał i funkcja „FUNC” z „Gwintowaniem.wątek ”odpowiednio. Na koniec użyliśmy funkcji łączenia () na końcu, aby podłączyć dwie funkcje.

Jak widać na wyświetlaczu wyniku, ustawiamy zakres na „20”, co wskazuje, że obliczenia zakończy się po dwudziestu iteracjach, ale w tym przypadku zakończyło się po pięciu iteracjach, mimo że nie kliknęliśmy żadnych klawisze przerwy klawiatury. Wskazuje to, że wątek nie został zabity, ale raczej zakończony, co jest korzystne dla prezentacji.

Wniosek

W tym artykule omówiliśmy, jak zabić wątek w Pythonie, odkryliśmy jednak, że chociaż możemy zatrzymać wykonanie wątku po pewnej liczbie iteracji, nie możemy zabić wątku w Pythonie. Najpierw utworzyliśmy wątek, a następnie użyliśmy wątku demona, aby go zabić. Mimo to stwierdziliśmy, że podczas korzystania z tego modułu moglibyśmy natychmiast zatrzymać wykonanie wątku, wpisując Ctrl-C, a wątek nie zostałby zabity. Wątek zostanie natychmiast zatrzymany po pewnej ilości wykonania, gdy użyliśmy obiektów zdarzenia Python, co było pomocne.