Wprowadzenie do współbieżności w Go

Wprowadzenie do współbieżności w Go
Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską. Czytaj więcej.

Współbieżność jest kluczowym aspektem nowoczesnego tworzenia oprogramowania, ponieważ umożliwia programom wydajną obsługę wielu zadań jednocześnie. Możesz pisać programy, które wykonują różne operacje prowadzące do poprawy wydajności, szybkości reakcji i wykorzystania zasobów.





Film dnia MUO PRZEWIŃ, ABY KONTYNUOWAĆ TREŚĆ

Współbieżność jest jedną z cech odpowiedzialnych za szybką adopcję Go. Wbudowana w Go obsługa programowania współbieżnego jest uważana za prostą, a jednocześnie pomaga uniknąć typowych pułapek, takich jak warunki wyścigu i zakleszczenia.





jak mogę pojawić się offline na facebooku?

Współbieżność w Go

Go zapewnia solidne wsparcie dla współbieżności poprzez różne mechanizmy, wszystkie dostępne w standardowej bibliotece i łańcuchu narzędzi. Idź programy osiągnąć współbieżność za pomocą goroutines i kanałów.





Goroutines to lekkie, niezależnie wykonujące funkcje, które działają równolegle z innymi goroutines w tej samej przestrzeni adresowej. Goroutines umożliwiają jednoczesne wykonywanie wielu zadań bez jawnego zarządzania wątkami. Goroutines są lżejsze niż wątki systemu operacyjnego, a Go może wydajnie obsługiwać tysiące, a nawet miliony goroutines jednocześnie.

Kanały to mechanizm komunikacji służący do koordynacji i wymiany danych między gorutynami. Kanał to typowany kanał, który umożliwia gorutynom wysyłanie i odbieranie wartości. Kanały zapewniają synchronizację, aby zapewnić bezpieczne udostępnianie danych między gorutynami, jednocześnie zapobiegając warunkom wyścigu i innym typowym problemom z współbieżnością.



Łącząc goroutines i kanały, Go zapewnia potężny i prosty model współbieżności, który upraszcza tworzenie współbieżnych programów przy jednoczesnym zachowaniu bezpieczeństwa i wydajności. Mechanizmy te umożliwiają łatwe korzystanie procesory wielordzeniowe i tworzyć wysoce skalowalne i responsywne aplikacje.

Jak używać Goroutines do współbieżnego wykonywania kodu

Środowisko wykonawcze Go zarządza goroutines. Goroutines mają swój stos, co pozwala im mieć lekki ślad przy początkowym rozmiarze stosu wynoszącym kilka kilobajtów.





Goroutines są multipleksowane na kilka wątków systemu operacyjnego przez środowisko uruchomieniowe Go. Harmonogram środowiska uruchomieniowego Go planuje je w dostępnych wątkach, wydajnie rozdzielając obciążenie, umożliwiając jednoczesne wykonywanie wielu gorutyn na mniejszej liczbie wątków systemu operacyjnego.

Tworzenie gorutyn jest proste. Użyjesz Iść słowo kluczowe, po którym następuje wywołanie funkcji w celu zadeklarowania gorutyn.





 func main() { 
    go function1() // Create and execute goroutine for function1
    go function2() // Create and execute goroutine for function2

    // ...
}

func function1() {
    // Code for function1
}

func function2() {
    // Code for function2
}

Kiedy program wywołuje funkcja1() I funkcja2() z Iść słowo kluczowe, środowisko uruchomieniowe Go wykonuje funkcje jednocześnie jako goroutines.

Oto przykład użycia goroutine, która wypisuje tekst na konsoli:

 package main 

import (
    "fmt"
    "time"
)

func printText() {
    for i := 1; i <= 5; i++ {
        fmt.Println("Printing text", i)
        time.Sleep(1 * time.Second)
    }
}

func main() {
    go printText() // Start a goroutine to execute the printText function concurrently

    // Perform other tasks in the main goroutine
    for i := 1; i <= 5; i++ {
        fmt.Println("Performing other tasks", i)
        time.Sleep(500 * time.Millisecond)
    }

    // Wait for the goroutine to finish
    time.Sleep(6 * time.Second)
}

The drukujTekst funkcja wielokrotnie drukuje jakiś tekst na konsoli za pomocą a Do pętla, która działa pięć razy po jednosekundowym opóźnieniu między każdą instrukcją z pakiet czasu .

The główny funkcja uruchamia goroutine przez wywołanie idź printText , który uruchamia drukujTekst funkcjonować jako oddzielna współbieżna gorutyna, która umożliwia wykonywanie funkcji współbieżnie z resztą kodu w główny funkcjonować.

jak znaleźć ukryte utwory na spotify

Wreszcie, aby upewnić się, że program nie zakończy się przed drukujTekst goroutine kończy, czas spać funkcja wstrzymuje główną goroutine na sześć sekund. W rzeczywistych scenariuszach używałbyś mechanizmów synchronizacji, takich jak kanały lub grupy oczekujących, do koordynowania wykonywania goroutines.

  wynik drukowania tekstu za pomocą Goroutines

Używanie kanałów do komunikacji i synchronizacji

Goroutines mają wbudowaną obsługę komunikacji i synchronizacji poprzez kanały, dzięki czemu pisanie współbieżnego kodu jest łatwiejsze niż tradycyjne wątki, które często wymagają ręcznych mechanizmów synchronizacji, takich jak blokady i semafory.

Kanały można traktować jako potoki do przepływu danych między gorutynami. Jeden goroutine może wysłać wartość do kanału, a inny goroutine może odebrać tę wartość z kanału. Mechanizm ten zapewnia bezpieczną i zsynchronizowaną wymianę danych.

Użyjesz <- operatora do wysyłania i odbierania danych za pośrednictwem kanałów.

Oto przykład demonstrujący podstawowe użycie kanałów do komunikacji między dwoma gorutynami:

 func main() { 
    // Create an unbuffered channel of type string
    ch := make(chan string)

    // Goroutine 1: Sends a message into the channel
    go func() {
        ch <- "Hello, Channel!"
    }()

    // Goroutine 2: Receives the message from the channel
    msg := <-ch
    fmt.Println(msg) // Output: Hello, Channel!
}

Kanał w główny funkcja jest niebuforowanym kanałem o nazwie rozdz stworzony z robić() funkcjonować. Pierwszy goroutine wysyła wiadomość „Hello, Channel!” do kanału za pomocą <- operatora, a druga gorutyna odbiera wiadomość z kanału korzystającego z tego samego operatora. Wreszcie, główny funkcja drukuje otrzymaną wiadomość na konsoli.

  wynik wydruku komunikatu przekazanego kanałem

Możesz zdefiniować określone kanały. Typ kanału określisz podczas tworzenia. Oto przykład ilustrujący użycie różnych typów kanałów:

 func main() { 
    // Unbuffered channel
    ch1 := make(chan int)

    // Buffered channel with a capacity of 3
    ch2 := make(chan string, 3)

    // Sending and receiving values from channels
    ch1 <- 42 // Send a value into ch1
    value1 := <-ch1 // Receive a value from ch1

    ch2 <- "Hello" // Send a value into ch2
    value2 := <-ch2 // Receive a value from ch2
}

The główny funkcja tworzy dwa kanały: kanał 1 jest niebuforowanym kanałem całkowitym, podczas gdy kanał 2 to buforowany kanał łańcuchowy o pojemności 3. Możesz wysyłać i odbierać wartości do iz tych kanałów za pomocą <- operator (wartości muszą być określonego typu).

Kanałów można używać jako mechanizmów synchronizacji do koordynowania wykonywania goroutine, wykorzystując blokujący charakter operacji na kanałach.

 func main() { 
    ch := make(chan bool)

    go func() {
        fmt.Println("Goroutine 1")
        ch <- true // Signal completion
    }()

    go func() {
        <-ch // Wait for the completion signal from Goroutine 1
        fmt.Println("Goroutine 2")
    }()

    <-ch // Wait for completion signal from Goroutine 2
    fmt.Println("Main goroutine")
}

The rozdz kanał jest logiczny. Dwie goroutines działają jednocześnie w główny funkcjonować. Goroutine 1 sygnalizuje zakończenie, wysyłając a PRAWDA wartość do kanału rozdz . Goroutine 2 czeka na sygnał zakończenia, odbierając wartość z kanału. Na koniec główny goroutine czeka na sygnał zakończenia od goroutine dwa.

Możesz tworzyć aplikacje internetowe w Go With Gin

Możesz tworzyć wysokowydajne aplikacje internetowe w Go z Gin, jednocześnie wykorzystując funkcje współbieżności Go.

Możesz użyć Gin do wydajnej obsługi routingu HTTP i oprogramowania pośredniczącego. Wykorzystaj wbudowaną obsługę współbieżności w Go, stosując gorutyny i kanały do ​​zadań takich jak zapytania do bazy danych, wywołania API lub inne operacje blokujące.