Wątek to pojedyncza jednostka wykonania w programie. Zwykły program jest jednokierunkowy, w którym instrukcje w programie wykonują sukcesywnie do czasu rozwiązania.
Z drugiej strony, wielokrotność umożliwia programowi tworzenie wielu wątków, w których instrukcje w programie mogą wykonywać jednocześnie. Oferuje doskonałe wykorzystanie zasobów systemowych, takich jak procesor i pamięć.
W Ruby używamy wątków za pomocą klasy wątków. Wątki w Ruby nie są ciężkie zasoby, co czyni je wydajnymi w stosowaniu współbieżności w twoich programach.
Wątki są zaimplementowane w ramach interpretera Ruby dla Ruby Version 1.9 i poniżej. Od wersji 1.9 i więcej, gwintowanie jest zaimplementowane w systemie operacyjnym.
Korzystając z tego przewodnika, dowiesz się, jak wdrażać wątki w programowaniu Ruby.
Punkt notowy: Interpreter MATZ (MRI) ma globalną blokadę interpretera, która powstrzymuje wiele wątków na jednoczesne działanie. Nie dotyczy to jednak tłumaczy Jruby i Rubinius.
Tworzenie wątku
Jak wspomniano, możemy pracować z wątkami za pomocą klasy wątków. Aby utworzyć nowy wątek, zadzwoń do wątku.Nowa metoda.
Składnia to:
Nitka.Nowy blok wątków # idzie tutaj
Upewnij się, aby dołączyć kod, który chcesz wykonać przez wątek wewnątrz pary kręconych.
Oto przykład:
Nitka.NOWOŚĆ Hello, World!"
Weźmy prosty program, który oblicza obszar koła.
Obszar def
PI = 3.14159
Rad = 7.3
return (pi * rad * rad)
koniec
Nitka.nowy
obszar()
umieszcza „biegnące w wątku!"
Uważa „Wykonanie zakończone!"
Jeśli uruchomisz powyższy przykład, zauważysz, że nie otrzymamy obszaru koła. Jest tak, ponieważ Ruby nie czeka, aż utworzone wątki zakończą wykonanie. Aby upewnić się, że wątki się zakończą, musimy wywołać metodę połączenia.
Metoda połączenia zatrzyma wykonanie głównego wątku i poczekać na zakończenie wątków określonych w metodzie połączenia.
Poniżej znajduje się przykładowy kod powyżej z zaimplementowaną metodą połączenia.
Obszar def
PI = 3.14159
Rad = 7.3
return (pi * rad * rad)
koniec
Wątek = wątek.nowy
Umieszcza „Obszar koła to #Area () CM2”
umieszcza „biegnące w wątku!"
nitka.dołączyć
Uważa „Wykonanie zakończone!"
W tym przykładzie otrzymujemy dane wyjściowe wątku, jak pokazano poniżej:
Obszar koła wynosi 167.41533109999997 CM2
Bieganie w wątku!
Wykonanie zakończone!
Zakończenie wątku
Ruby zapewnia różne sposoby zakończenia wątku. Jednym z takich sposobów jest użycie metody zabicia.
Składnia to:
Nitka.zabójstwo (wątek)
Określ nazwę wątku, aby zakończyć się w nawiasie.
Wyjątki wątku
Zauważysz, że jeśli wyjątek pojawi się w wątku, wykonanie programu nie kończy.
Na przykład:
def error_me
Podnieś „błąd!"
koniec
Nitka.nowy error_me
stawia „wciąż biegam”
W powyższym przykładzie podnosimy wyjątek wewnątrz funkcji przekazanej do wątku. Zauważysz dwie rzeczy:
- Wątek nie wyświetli komunikatu o błędzie
- Kod po wątku nadal działa.
W niektórych przypadkach możesz przestać wykonać, jeśli wyjątek pojawi się w wątku. Możemy to zrobić za pomocą abort_on_execption.
Na przykład:
Nitka.abort_on_exception = true
thready = wątek.NOWOŚĆ
Umieszcza „Run I Fore wyjątkiem”
Wystąpił wyjątek „Podnieś”!"
koniec
nitkowaty.dołączyć
stawia „przepraszam, nie biegam!"
W powyższym przykładzie program zakończy się zakończenie. Oto przykład wyjścia:
Biegnę przed wyjątkiem
# zakończone z wyjątkiem (raport_on_exception jest prawdziwy):
wątki.RB: 4: W „Block in”: Wystąpił wyjątek! (Runtimeerror)
wątki.RB: 4: w „bloku w
': wystąpił wyjątek! (Runtimeerror) Zmienne wątku
Zmienne utworzone w wątku przestrzegają zasad Ruby Scope. Są dostępne tylko w zakresie wątku, w którym są tworzone.
Stany wątków
Możesz pobrać stan danego wątku za pomocą metody statusu. Możesz także użyć życia, aby sprawdzić, czy wątek działa, i zatrzymać się, aby sprawdzić, czy wątek jest martwy.
Istnieje pięć wartości powrotnych dla metody statusu:
- Działanie - Zwroty biegowe
- Spać - powraca spanie
- Anulować - Zwraca przerwanie
- Zakończone z wyjątkiem - zwraca zero
- Zakończyć normalnie - zwraca fałsz.
Wniosek
W tym przewodniku omówiliśmy podstawy pracy z wątkami w języku programowania Ruby.
Warto zauważyć, że jest w tym coś więcej niż to, co omówiliśmy w tym przewodniku. Rozważ dokumentację, aby dowiedzieć się więcej.
Dziękuję za przeczytanie!