Skaitmeninis Pasaulis | Programinės Įrangos Paviljonas
Programinės įrangos vadovėliai => Golang => Temą pradėjo: Gozge raytas Mar 30, 2025, 12:24 PM
Golang (arba Go) yra moderni programavimo kalba, kuri išsiskiria savo paprastumu ir galingu konkurencingumo (angl. concurrency) mechanizmu. Šiame straipsnyje aptarsime Golang konkurencingumo logiką, kaip ji veikia, ir pateiksime praktinius pavyzdžius. Turinys yra pritaikytas SEO reikalavimams ir orientuotas į tokius raktinius žodžius kaip ,,Golang concurrency", ,,Go goroutines" ar ,,Golang kanalai".
Kas yra Concurrency Golang Kalboje?Konkurencingumas Golang kalboje leidžia vykdyti kelias užduotis vienu metu, efektyviai išnaudojant procesoriaus resursus. Skirtingai nei tradicinis daugiagijis programavimas (angl. multithreading), Golang naudoja goroutines ir kanalus (angl. channels), kad supaprastintų lygiagrečių procesų valdymą.- Goroutines: Lengvos gijos, kurios veikia nepriklausomai.
- Kanalai: Mechanizmas, skirtas duomenų mainams tarp goroutines.
Goroutines: Kaip Jie Veikia?Goroutine yra funkcija, kuri vykdoma lygiagrečiai su kitomis programos dalimis. Jos kuriamos naudojant raktinį žodį go.Pavyzdys 1: Paprasta Goroutinepackage main
import "fmt"
func spausdintiTeksta(tekstas string) {
for i := 0; i < 3; i++ {
fmt.Println(tekstas)
}
}
func main() {
go spausdintiTeksta("Goroutine veikia!") // Paleidžiama kaip goroutine
spausdintiTeksta("Pagrindinė funkcija") // Vykdoma pagrindinėje gijoje
}
Šiame pavyzdyje go spausdintiTeksta paleidžia funkciją kaip goroutine, o pagrindinė programa tęsiasi. Pastaba: rezultatai gali būti nenuspėjami, nes goroutine vykdymo tvarka nėra garantuota.
Kanalai: Duomenų SinchronizacijaKanalai (angl. channels) leidžia goroutines keistis duomenimis ir sinchronizuoti jų veikimą. Jie kuriami su make(chan tipas).Pavyzdys 2: Kanalo Naudojimaspackage main
import "fmt"
func siustiDuomenis(kanalas chan int) {
kanalas <- 42 // Siunčiamas skaičius į kanalą
}
func main() {
kanalas := make(chan int) // Sukuriamas kanalas
go siustiDuomenis(kanalas)
skaicius := <-kanalas // Gaunami duomenys iš kanalo
fmt.Println("Gautas skaičius:", skaicius) // Rezultatas: Gautas skaičius: 42
}
Čia <- operatorius naudojamas duomenų siuntimui ir gavimui. Kanalai užtikrina, kad viena goroutine lauktų, kol kita perduos duomenis.
WaitGroup: Goroutines SinchronizacijaNorint palaukti, kol visos goroutines baigs darbą, naudojamas sync.WaitGroup.Pavyzdys 3: WaitGroup Naudojimaspackage main
import (
"fmt"
"sync"
)
func vykdytiUžduotį(id int, wg *sync.WaitGroup) {
defer wg.Done() // Signalizuoja, kad goroutine baigė darbą
fmt.Printf("Užduotis %d atlikta\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1) // Pridedama užduotis
go vykdytiUžduotį(i, &wg)
}
wg.Wait() // Laukiama, kol visos užduotys baigsis
fmt.Println("Visos užduotys atliktos!")
}
Rezultatas gali būti:Užduotis 2 atlikta
Užduotis 1 atlikta
Užduotis 3 atlikta
Visos užduotys atliktos!
Kodėl Golang Concurrency Yra Efektyvus?- Lengvos Goroutines: Jos naudoja mažiau atminties nei tradicinės gijos.
- Paprastas Sinchronizavimas: Kanalai pašalina sudėtingus užraktus (angl. locks).
- Galingumas: Go runtime efektyviai paskirsto užduotis tarp procesoriaus branduolių.
Praktinis Pavyzdys: Lygiagretus SkaičiavimasTarkime, norime apskaičiuoti kelių skaičių kvadratus lygiagrečiai:package main
import "fmt"
func kvadratas(skaicius int, kanalas chan int) {
rezultatas := skaicius * skaicius
kanalas <- rezultatas
}
func main() {
skaiciai := []int{2, 4, 6, 8}
kanalas := make(chan int)
for _, sk := range skaiciai {
go kvadratas(sk, kanalas)
}
for i := 0; i < len(skaiciai); i++ {
fmt.Println("Kvadratas:", <-kanalas)
}
}
Rezultatas gali būti:Kvadratas: 4
Kvadratas: 16
Kvadratas: 36
Kvadratas: 64
IšvadaGolang konkurencingumo logika, paremta goroutines ir kanalais, yra paprasta, bet itin galinga. Šie mechanizmai leidžia lengvai kurti efektyvias ir lygiagrečias programas. Naudodami pateiktus pavyzdžius, galite pradėti eksperimentuoti su Golang concurrency savo projektuose. Jei turite klausimų ar reikia daugiau pavyzdžių, klauskite!