Eşzamanlılık (Goroutines ve Channels)
Fonksiyonları aynı anda (asenkron) çalıştırmak ve aralarında veri taşımak.
Goroutine: Go runtime tarafından yönetilen son derece hafif iş parçacıklarıdır (threads). Sadece bir fonksiyonun başına go anahtar kelimesi koyarak arka planda çalışmasını sağlayabilirsiniz.
Channels: Arka planda eşzamanlı çalışan goroutine'ler birbirleriyle belleği paylaşarak değil, chan yapısı üzerinden mesaj/veri göndererek haberleşirler. Bu mimari Deadlock'ları önler.
Goroutine ve Channel Haberleşmesi
package main
import (
"fmt"
"time"
)
// Arka planda çalışacak fonksiyon. İş bitince kanala (ch) veri gönderir.
func processWorker(id int, ch chan string) {
time.Sleep(time.Second * 1) // 1 saniyelik iş
msg := fmt.Sprintf("İşçi %d işini bitirdi.", id)
ch <- msg // Veriyi kanala gönder
}
func main() {
// String taşıyan bir kanal (Channel) oluşturduk
messages := make(chan string)
// 3 tane işçiyi aynı anda (asenkron) çalıştırıyoruz
go processWorker(1, messages)
go processWorker(2, messages)
go processWorker(3, messages)
// Ana thread, kanaldan 3 tane mesaj gelene kadar bloklanır (bekler)
for i := 0; i < 3; i++ {
result := <-messages // Kanaldan veriyi al
fmt.Println(result)
}
fmt.Println("Tüm işler tamamlandı!")
}