Zistite, ako goroutiny a kanály umožňujú efektívnu súbežnosť vo vašich programoch Go.

Súbežnosť je kľúčovým aspektom moderného vývoja softvéru, pretože umožňuje programom efektívne zvládnuť viacero úloh súčasne. Môžete písať programy, ktoré vykonávajú rôzne operácie vedúce k zlepšeniu výkonu, odozvy a využitia zdrojov.

Súbežnosť je jednou z funkcií zodpovedných za rýchle prijatie Go. Vstavaná podpora súbežného programovania Go sa považuje za priamu a zároveň pomáha vyhnúť sa bežným nástrahám, ako sú podmienky pretekov a uviaznutie.

Súbežnosť v Go

Go poskytuje robustnú podporu súbežnosti prostredníctvom rôznych mechanizmov, ktoré sú všetky dostupné v štandardnej knižnici a reťazci nástrojov. Choďte na programy dosiahnuť súbežnosť prostredníctvom gorutínov a kanálov.

Goroutines sú ľahké, nezávisle vykonávané funkcie, ktoré bežia súbežne s inými goroutinemi v rovnakom adresnom priestore. Goroutines umožňujú, aby viacero úloh prebiehalo súčasne bez explicitnej správy vlákien. Goroutíny sú ľahšie ako vlákna operačného systému a Go dokáže efektívne spúšťať tisíce alebo dokonca milióny goutín súčasne.

instagram viewer

Kanály sú komunikačným mechanizmom na koordináciu a zdieľanie údajov medzi goroutinami. Kanál je typizovaný kanál, ktorý umožňuje goroutinom odosielať a prijímať hodnoty. Kanály poskytujú synchronizáciu, aby sa zaistilo bezpečné zdieľanie údajov medzi goroutinami a zároveň sa zabránilo rasovým podmienkam a iným bežným problémom so súbežnosťou.

Kombináciou gorutín a kanálov poskytuje Go výkonný a jednoduchý súbežný model, ktorý zjednodušuje vývoj súbežných programov pri zachovaní bezpečnosti a efektívnosti. Tieto mechanizmy umožňujú jednoduché používanie viacjadrové procesory a vytvárať vysoko škálovateľné a citlivé aplikácie.

Ako používať goroutiny na súbežné spúšťanie kódu

Runtime Go spravuje gorutiny. Goroutíny majú svoj zásobník, ktorý im umožňuje mať ľahkú stopu s počiatočnou veľkosťou zásobníka niekoľko kilobajtov.

Goroutines sú multiplexované do niekoľkých vlákien operačného systému runtime Go. Runtime plánovač Go ich naplánuje na dostupné vlákna efektívnym rozložením pracovného zaťaženia, čo umožňuje súbežné vykonávanie viacerých goroutín na menšom počte vlákien OS.

Vytváranie gorutínov je jednoduché. Budete používať ísť kľúčové slovo, za ktorým nasleduje volanie funkcie na deklarovanie gorutínov.

funcHlavná() {
ísť funkcia1() // Vytvorte a spustite goroutine pre funkciu1
ísť funkcia2() // Vytvorte a spustite goroutine pre funkciu2

// ...
}

funcfunkcia1() {
// Kód pre funkciu1
}

funcfunkcia2() {
// Kód pre funkciu2
}

Keď program vyvolá funkcia1() a funkcia2() s ísť Go runtime spúšťa funkcie súčasne ako goroutiny.

Tu je príklad použitia goroutinu, ktorý vytlačí text do konzoly:

balík Hlavná

importovať (
"fmt"
"čas"
)

funcprintText() {
pre ja:= 1; ja <= 5; i++ {
fmt. Println("Tlač textu", i)
čas. Spánok (1 *čas. druhý)
}
}

funcHlavná() {
ísť printText() // Spustenie gorutiny na súčasné spustenie funkcie printText

// Vykonajte ďalšie úlohy v hlavnej goroutine
pre ja:= 1; ja <= 5; i++ {
fmt. Println("Vykonávanie iných úloh", i)
čas. Spánok (500 *čas. milisekúnd)
}

// Počkajte na dokončenie goroutínu
čas. Spánok (6 *čas. druhý)
}

The printText funkcia opakovane vytlačí nejaký text do konzoly s a pre slučka, ktorá sa spustí päťkrát po jednosekundovom oneskorení medzi každým príkazom s časový balík.

The Hlavná funkcia spustí gorutinu volaním prejdite na tlač textu, ktorý spúšťa printText funguje ako samostatná súbežná gorutina, ktorá umožňuje, aby sa funkcia vykonávala súčasne so zvyškom kódu v Hlavná funkciu.

Nakoniec, aby ste sa uistili, že program neskončí skôr ako printText goroutine skončí, čas. Spánok funkcia pozastaví hlavnú rutinu na šesť sekúnd. V reálnych scenároch by ste na koordináciu vykonávania gorutín použili mechanizmy synchronizácie, ako sú kanály alebo čakacie skupiny.

Používanie kanálov na komunikáciu a synchronizáciu

Goroutines majú vstavanú podporu pre komunikáciu a synchronizáciu cez kanály, vďaka čomu je písanie súbežné kód jednoduchšie ako tradičné vlákna, ktoré často vyžadujú manuálne synchronizačné mechanizmy, ako sú zámky a semafory.

Kanály si môžete predstaviť ako kanály pre tok údajov medzi goroutinami. Jedna rutina môže odoslať hodnotu do kanála a ďalšia rutina môže túto hodnotu z kanála prijať. Tento mechanizmus zabezpečuje, že výmena údajov je bezpečná a synchronizovaná.

Budete používať odosielať a prijímať dáta cez kanály.

Tu je príklad demonštrujúci základné využitie kanálov na komunikáciu medzi dvoma goroutinemi:

funcHlavná() {
// Vytvorte kanál bez vyrovnávacej pamäte typu string
ch := urobiť(chanreťazec)

// Goroutine 1: Odošle správu do kanála
ísťfunc() {
ch "Ahoj, Channel!"
}()

// Goroutine 2: Prijme správu z kanála
msg := fmt. Println (správa) // Výstup: Dobrý deň, kanál!
}

Kanál v Hlavná funkcia je kanál bez vyrovnávacej pamäte s názvom ch vytvorené s urobiť() funkciu. Prvý goroutín pošle správu "Hello, Channel!" do kanála pomocou operátor a druhý goroutín prijme správu z kanála pomocou toho istého operátora. Nakoniec, Hlavná funkcia vytlačí prijatú správu do konzoly.

Môžete definovať typizované kanály. Typ kanála určíte pri vytváraní. Tu je príklad, ktorý ukazuje použitie rôznych typov kanálov:

funcHlavná() {
// Kanál bez vyrovnávacej pamäte
ch1 := urobiť(chanint)

// Kanál s vyrovnávacou pamäťou s kapacitou 3
ch2 := urobiť(chanreťazec, 3)

// Odosielanie a prijímanie hodnôt z kanálov
ch1 42// Pošlite hodnotu do ch1
hodnota1 := // Prijme hodnotu z ch1

ch2 "Ahoj"// Pošlite hodnotu do ch2
hodnota2 := // Prijme hodnotu z ch2
}

The Hlavná funkcia vytvára dva kanály: ch1 je celočíselný kanál bez vyrovnávacej pamäte, zatiaľ čo ch2 je kanál reťazca s vyrovnávacou pamäťou s kapacitou 3. Hodnoty do az týchto kanálov môžete odosielať a prijímať pomocou operátor (hodnoty musia byť špecifikovaného typu).

Kanály môžete použiť ako synchronizačný mechanizmus na koordináciu vykonávania rutiny využitím blokovacej povahy operácií s kanálmi.

funcHlavná() {
ch := urobiť(chanbool)

ísťfunc() {
fmt. Println("Goroutine 1")
ch pravda// Dokončenie signálu
}()

ísťfunc() {
// Počkajte na signál dokončenia z Goroutine 1
fmt. Println("Goroutine 2")
}()

// Počkajte na signál dokončenia z Goroutine 2
fmt. Println("Hlavná goroutína")
}

The ch kanál je boolovský. Súbežne prebiehajú dve goroutiny Hlavná funkciu. Goroutine 1 signalizuje jeho ukončenie odoslaním a pravda hodnotu do kanála ch. Goroutine 2 čaká na signál dokončenia prijatím hodnoty z kanála. Nakoniec hlavná goroutina čaká na signál dokončenia z gorutiny dva.

Môžete vytvárať webové aplikácie v Go With Gin

V Go with Gin môžete vytvárať výkonné webové aplikácie a zároveň využívať funkcie súbežnosti Go.

Gin môžete použiť na efektívne spracovanie smerovania HTTP a middleware. Využite vstavanú podporu súbežnosti Go využívaním gorutín a kanálov pre úlohy, ako sú databázové dotazy, volania API alebo iné blokovacie operácie.