Zamknięcie nici Python

Zamknięcie nici Python
W Python istnieją dwa stany zamka: zablokowane i odblokowane. Blokada to klasa biblioteki wątków Python. Musimy tylko zaimportować blokadę podczas korzystania z zamka w gwintowaniu. Pierwszą procedurą zamka jest „Acquire ()”, a drugie podejście to „Release ()”. W Pythonie zamki są najbardziej podstawową prymitywną synchronizacją.

Przykład nr 1: Wykonanie skryptu wątku Pythona Wykorzystanie limitu czasu w Acquire () Lock.

W tym przykładzie omówimy użycie metody „acquire ()”. Metodę „Acquire ()” można zastosować do zablokowania. Nie można podjąć więcej wysiłków, aby to osiągnąć, dopóki zamek nie zostanie wydany po zamknięciu wątku. Metodę „Acquire ()” można zastosować do zabezpieczenia zamka. Gdy wątek zabezpieczy zamek, nie można podjąć dalszych prób, dopóki zamek się nie zostanie zwolniony. W tym przypadku metody „nabywaj ()” zostanie również zastosowana opcja „limit czasu. Jeśli potencjalna wartość wątku wynosi 1, czyli 1, wątek będzie opóźniony w nieskończoność, dopóki nie nabył zamka. Tutaj użyliśmy tego, aby określić, jak długo wątek będzie szukał zamka.

Zacznijmy wdrażać skrypt za pomocą narzędzia „Spyder” do wdrożenia kodu. Najpierw zamierzamy zaimportować blokadę i wątek z biblioteki wątków Python. Wątki są wykorzystywane w procesie Pythona do wykonywania kodu. Każdy program ma domyślnie jeden wątek, ale być może będziemy musieli stworzyć więcej wątków, jeśli chcemy wykonać kilka procesów jednocześnie. Moduł snu jest następnie importowany. Metoda „sleep ()” w module czasowym Pythona służy do zatrzymania wykonywania programu na z góry określony czas. Sugeruje to, że program jest tymczasowo zawieszony przed automatycznie wykonany po z góry określonym okresie. Następnie stosuje się metodę „lock ()”. Następnie, w poniższym wierszu, definiujemy funkcję o nazwie „FUNC1” i przekazujemy zmienną „zamek” w nawiasach.

Oświadczenie „IF” umożliwia wykonanie instrukcji lub zestawu oświadczeń w określonych okolicznościach opartych na wyniku wyrażenia. Używamy metody „Acquire ()” w obiekcie zamka wewnątrz warunku „jeśli”, aby wątek nieustannie czekał na zamek. Przekazujemy limit czasu jako jeden z jego parametrów i ustawiamy go na „10” w nawiasach funkcji „Acquire ()”. Teraz, jeśli instrukcja spełnia wymaganie, używamy funkcji „print ()”, przekazując instrukcję „Wątek 2: Done” w nawiasach, a następnie wywołujemy metodę release () w module obiektu blokady. Jeśli zamek zostanie zablokowany, proces ten zareaguje po powróceniu go na jego odblokowany stan.

Dodatkowo ta metoda może być wywoływana przez dowolny wątek. Jest dozwolony dla jednego z wątków, które już czekają na uzyskanie wstrzymania, aby się na nim zawiesić, dopóki ta funkcja zostanie wywołana. Teraz drukujemy oświadczenie „Wątek 1: Limit czasu”, jeśli warunek nie jest spełniony. Teraz zbudujemy nową funkcję o nazwie „FUNC” i blokowaniu parametrów w następującym wierszu. Następnie, za pomocą obiektu Lock, wykonujemy metodę „Acquire ()”. W poniższym wierszu wywołujemy funkcję „print ()” i podajemy instrukcję „Wątek 1: Done” przed użyciem metody „release ()” z blokadą.

Teraz utworzymy wątek i wywołymy metody wątku, wywołując obiekt wątku. Użyliśmy wątku i ustawiliśmy w nim „Target = Func”, przekazując argument „Zamknij”,. Następnie zapisaliśmy ten wątek w zmiennej o nazwie „Thread1.„W następnym wierszu zadzwoniliśmy do wątku„ Func1 ”i przeszliśmy argument„ Zamkaj ”, używając„ Thread1.start () ”, aby uruchomić wątek. Zrobiliśmy to samo dla Thread2. Metoda „łącza ()” jest następnie używana do oczekiwania na wykonanie wątku. Zatem mamy dwa wątki, z których każdy nazywa dwie odrębne rutyny. Limit czasu dla drugiego wątku to „10” sekund, a pierwszy wątek działa przez „2” sekundy.

Wyświetlacz wyjściowy pokazuje teraz, że wątek 1 jest wykonywany najpierw, ponieważ został wygenerowany jako pierwszy i był w stanie uzyskać dostęp do blokady i zakończyć wykonanie. Wątek 2 jest zakończony, ponieważ limit czasu ustawiono na „10” sekund, jak widać.

Przykład nr 2: Korzystanie z blokady wątku Pythona w stanie wyścigu

W tym przykładzie użyjemy blokady nici Python w stanie wyścigu. Warunek wyścigu występuje, gdy dwa wątki patrzą jednocześnie na wspólną zmienną. Początkowe i drugie wątki otrzymały ten sam wynik ze stały oryginalnego wątku. Następnie dwa wątki próbują zmienić wspólną wartość zmiennej zależnej. Dane z wątku, które dodają do listy zmiennych współdzielonych.

Zacznijmy wdrażać kod. W pierwszym wierszu importujemy moduł blokady z modułu gwintowania. A w poniższym wierszu importujemy moduł czasu. Następnie tworzymy zmienną i nadajemy jej wartość „20”. W następnym wierszu tworzymy funkcję o nazwie „Func1” i przekazujemy dwie zmienne „przyrost” i „blokada” jako jej parametry. Tworzymy zmienną globalną o nazwie „A” i przekazujemy jej zamek.

Wreszcie, w poniższym wierszu, tworzymy zmienną o nazwie „Local_Counter” i przekazujemy ją do niej. Wartość tego „lokalnego licznika” jest zwiększana w następnym wierszu, w zależności od tego, które wątek kończy się ostatni. Następnie nazywamy „czas.Metoda sleep () ”i zapewnij okres„ 0.5 ”sekund w następującej linii. Metoda „print ()” jest następnie wykonywana, a licznik lokalny jest zapisywany w zmiennej „A”. W ramach tej funkcji bieżący wątek jest wywoływany za pomocą „wątku.current_thread ().Nazwa przyrostowa A przyrost ”i przekazuje„ A ”, w którym wartość jest przechowywana, a metoda„ release () ”z zamkiem jest wywoływana w następującym wierszu. W następnym wierszu przekazujemy metodę Lock ().

Teraz utworzymy dwa wątki i wywołać funkcję za pomocą wątków. Wywołujemy funkcję w pierwszym wątku, używając wątku.Wątek, użyłem „Target = Func1” i przekazaj argument „15” jako jego przyrost i „zamek”. Zapisaliśmy ten pierwszy wątek w zmiennej „T1”, a następnie powtarzamy tę samą procedurę dla wątku 2, ale przekazujemy argument, który jest przyrostem „5” i „zamka”. Następnie używamy „wątku.start () ”, aby uruchomić wątek i„ dołączyć () ”, aby poczekać na zakończenie wątku. Wartość końcowa zostanie następnie wyświetlona.

Teraz po prostu umieść ten kod powoduje, że oba wątki odczytują wartość, którą udostępniliśmy. „T1” i „T2” spróbują zmienić wartość „a” w funkcji przyrostu przy użyciu wartości przyrostu „15” i „5”, które są dostarczane w krotce parametrów.

Teraz wyświetla wynik końcowy „40” w wyjściu. Ponieważ mamy „a = 20” w powyższym kodzie, gdy „wątek 1” wzrasta o „15”, wynik to „35”, a wartość zmienia się jednak w „35”, gdy „wątek 2” wzrasta o „5” Rezultat to „40”.

Wniosek

Funkcja blokady wątku Python, która ma dwie metody: Acquire () i release () jest omówione w tym artykule. W tym przewodniku przedstawiono dwa przykłady. Po pierwsze, użyliśmy limitu czasu w zamku nabywu (), aw drugim przykładzie użyliśmy stanu wyścigu za pomocą Python Lock (), aby pokazać, jak wpływa na to, jak działają wątki. Spodziewamy się, że te przypadki pomogą przy użyciu zamków wątków w Python.