Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Goroutinleri iptal etmek için birçok seçenek vardır, ancak bu örnek bize bir kanalı bu amaçla nasıl kullanabileceğimizi göstermektedir. Üç goroutine çalıştıracağız ve bunlardan biri "done" kanalına yazar yazmaz, diğerleri iptal edilecek. Her goroutinin üç kez baskı yapması amaçlanmıştır.


Örnek


package main

import (
"log"
"time"
)

func main() {
done := make(chan struct{})

go run(done, 1)
go run(done, 2)
time.Sleep(time.Second) // Cause the last one to not complete all three jobs
go run(done, 3)

<-done
}

func run(done chan<- struct{}, id int) {
i := 1

ticker := time.NewTicker(time.Second)
defer ticker.Stop()

for {
select {
case <-ticker.C:
// Do something here
log.Println(id, "- done", i)

i++
if i == 4 {
done<- struct{}{}
}
}
}
}

Sonuç


Aşağıda görüldüğü gibi üçüncü goroutine üç kez baskı yapma şansına sahip olamamıştır.


2020/06/16 22:32:24 2 - done 1
2020/06/16 22:32:24 1 - done 1
2020/06/16 22:32:25 2 - done 2
2020/06/16 22:32:25 1 - done 2
2020/06/16 22:32:25 3 - done 1
2020/06/16 22:32:26 1 - done 3
2020/06/16 22:32:26 2 - done 3