Kodkitabi

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ı!")
}