Naučite kako goroutines i kanali omogućuju učinkovitu konkurentnost u vašim Go programima.

Konkurentnost je ključni aspekt modernog razvoja softvera jer omogućuje programima da učinkovito obrađuju više zadataka istovremeno. Možete pisati programe koji izvršavaju različite operacije koje dovode do poboljšanih performansi, odziva i korištenja resursa.

Konkurentnost je jedna od značajki odgovornih za brzo usvajanje Goa. Go-ova ugrađena podrška za istovremeno programiranje smatra se jednostavnom dok pomaže u izbjegavanju uobičajenih zamki kao što su uvjeti utrke i zastoji.

Konkurentnost u Go

Go pruža robusnu podršku za konkurentnost kroz različite mehanizme, koji su svi dostupni u njegovoj standardnoj biblioteci i lancu alata. Go programi postići konkurentnost kroz goroutine i kanale.

Goroutine su lagane, neovisno izvršavajuće funkcije koje se izvode istodobno s drugim goroutinama unutar istog adresnog prostora. Goroutines omogućuju istovremeno odvijanje više zadataka bez eksplicitnog upravljanja nitima. Goroutine su lakše od niti operativnog sustava i Go može učinkovito pokretati tisuće ili čak milijune goroutina istovremeno.

instagram viewer

Kanali su komunikacijski mehanizam za koordinaciju i dijeljenje podataka između goroutina. Kanal je tipizirani kanal koji omogućuje goroutinama slanje i primanje vrijednosti. Kanali pružaju sinkronizaciju kako bi se osiguralo sigurno dijeljenje podataka između goroutina dok se istovremeno sprječavaju uvjeti utrke i drugi uobičajeni problemi paralelnosti.

Kombinirajući goroutines i kanale, Go pruža moćan i jednostavan model konkurentnosti koji pojednostavljuje razvoj konkurentnih programa uz održavanje sigurnosti i učinkovitosti. Ovi mehanizmi vam omogućuju jednostavno korištenje višejezgreni procesori i izgraditi visoko skalabilne i osjetljive aplikacije.

Kako koristiti Goroutines za istovremeno izvršavanje koda

Go runtime upravlja goroutinama. Goroutines imaju svoj snop, što im omogućuje lagani otisak s početnom veličinom snopa od nekoliko kilobajta.

Goroutine se multipleksiraju na nekoliko OS niti pomoću Go runtimea. Go runtime planer raspoređuje ih na dostupne niti učinkovitom raspodjelom radnog opterećenja, dopuštajući istovremeno izvršavanje više gorutina na manje OS niti.

Stvaranje goroutina je jednostavno. Vi ćete koristiti ići ključna riječ nakon koje slijedi poziv funkcije za deklariranje goroutine.

funkglavni() {
ići funkcija1() // Stvaranje i izvođenje goroutine za funkciju1
ići funkcija2() // Stvaranje i izvođenje goroutine za funkciju2

// ...
}

funkfunkcija1() {
// Kod za funkciju1
}

funkfunkcija2() {
// Kod za funkciju2
}

Kada program pozove funkcija1() i funkcija2() s ići ključna riječ, Go runtime izvršava funkcije istovremeno kao goroutines.

Evo primjera upotrebe goroutine koja ispisuje tekst na konzolu:

paket glavni

uvoz (
"fmt"
"vrijeme"
)

funkprintText() {
za ja := 1; ja <= 5; i++ {
fmt. Println("Ispisivanje teksta", i)
vrijeme. Spavati(1 * vrijeme. Drugi)
}
}

funkglavni() {
ići printText() // Pokretanje goroutine za istodobno izvršavanje funkcije printText

// Izvođenje drugih zadataka u glavnoj goroutini
za ja := 1; ja <= 5; i++ {
fmt. Println("Obavljanje ostalih poslova", i)
vrijeme. Spavati(500 * vrijeme. milisekunda)
}

// Pričekajte da goroutina završi
vrijeme. Spavati(6 * vrijeme. Drugi)
}

The printText funkcija više puta ispisuje neki tekst na konzolu s a za petlja koja se izvodi pet puta nakon odgode od jedne sekunde između svake izjave s vremenski paket.

The glavni funkcija pokreće goroutine pozivom idi printText, koji pokreće printText funkcionirati kao zasebna istodobna gororutina koja omogućuje funkciji istodobno izvršavanje s ostatkom koda u glavni funkcija.

Konačno, kako biste osigurali da program ne izađe prije printText goroutine završava, the vrijeme. Spavati funkcija pauzira glavnu rutinu na šest sekundi. U scenarijima stvarnog svijeta koristili biste mehanizme sinkronizacije poput kanala ili grupa čekanja za koordinaciju izvršavanja goroutina.

Korištenje kanala za komunikaciju i sinkronizaciju

Goroutines imaju ugrađenu podršku za komunikaciju i sinkronizaciju kroz kanale, čineći pisanje istodobnim kodirati lakše od tradicionalnih niti, koje često zahtijevaju mehanizme ručne sinkronizacije poput brava i semafori.

Možete zamisliti kanale kao cjevovode za protok podataka između goroutina. Jedna gorutina može poslati vrijednost u kanal, a druga gorutina može primiti tu vrijednost iz kanala. Ovaj mehanizam osigurava da je razmjena podataka sigurna i sinkronizirana.

Vi ćete koristiti operater za slanje i primanje podataka putem kanala.

Evo primjera koji pokazuje osnovnu upotrebu kanala za komunikaciju između dvije gorutine:

funkglavni() {
// Kreirajte kanal bez međuspremnika tipa string
ch := napraviti(channiz)

// Goroutine 1: Šalje poruku u kanal
ićifunk() {
ch "Zdravo, kanal!"
}()

// Goroutine 2: Prima poruku s kanala
poruka := fmt. Println (poruka) // Izlaz: Pozdrav, kanal!
}

Kanal u glavni funkcija je kanal bez međuspremnika pod nazivom CH stvoren s napraviti() funkcija. Prva goroutina šalje poruku "Hello, Channel!" u kanal pomoću operator, a druga goroutina prima poruku od kanala koristeći isti operator. Konačno, glavni funkcija ispisuje primljenu poruku na konzolu.

Možete definirati unesene kanale. Vrstu kanala navest ćete prilikom izrade. Evo primjera koji pokazuje korištenje različitih vrsta kanala:

funkglavni() {
// Unbuffered kanal
ch1 := napraviti(chanint)

// Međuspremnik kanala s kapacitetom od 3
ch2 := napraviti(channiz, 3)

// Slanje i primanje vrijednosti s kanala
ch1 42// Pošalji vrijednost u ch1
vrijednost1 := // Primi vrijednost iz ch1

ch2 "Zdravo"// Pošalji vrijednost u ch2
vrijednost2 := // Primi vrijednost iz ch2
}

The glavni funkcija stvara dva kanala: ch1 je unbuffered cjelobrojni kanal, dok je ch2 je baferirani string kanal s kapacitetom od 3. Možete slati i primati vrijednosti na i s ovih kanala pomoću operator (vrijednosti moraju biti navedenog tipa).

Možete koristiti kanale kao mehanizme sinkronizacije za koordinaciju izvršavanja goroutine iskorištavanjem blokirajuće prirode operacija kanala.

funkglavni() {
ch := napraviti(chanbool)

ićifunk() {
fmt. Println("Gorutina 1")
ch pravi// Završetak signala
}()

ićifunk() {
// Pričekajte signal završetka iz Goroutine 1
fmt. Println("Gorutina 2")
}()

// Pričekajte signal završetka iz Goroutine 2
fmt. Println("Glavna goroutina")
}

The CH kanal je Boolean. Dvije goroutine rade istovremeno u glavni funkcija. Goroutine 1 signalizira svoj završetak slanjem a pravi vrijednost u kanal CH. Goroutine 2 čeka signal završetka primanjem vrijednosti od kanala. Konačno, glavna gorprograma čeka signal završetka iz gorprograma dva.

Možete izraditi web-aplikacije u Go With Ginu

Možete izraditi web-aplikacije visokih performansi u Go with Gin dok iskorištavate Goove značajke konkurentnosti.

Možete koristiti Gin za učinkovito rukovanje HTTP usmjeravanjem i međuprogramom. Iskoristite Goovu ugrađenu podršku za konkurentnost upotrebom goroutina i kanala za zadatke kao što su upiti baze podataka, API pozivi ili druge operacije blokiranja.