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.

2 ana goroutine var ve her birinde 5 alt goroutine var. Toplam olarak 10 goroutine var. Yapacağımız şey, bunlardan herhangi biri başarısız olursa, hepsi başarısız olacak. Bunu bir hata döndürerek yapacağız. Kullandığımız örnek bir oyun oynamak gibidir. Her alt goroutine içinde rastgele iki sayı seçeceğiz. Her ikisi de 0'a eşitse, o zaman goroutine içinde hata döndüreceğiz. Aksi takdirde tümü sonsuza kadar devam edecek.


MAIN/PARENT - SUB/CHILD
1 1, 2, 3, 4, 5
2 1, 2, 3, 4, 5

Örnek


package main

import (
"context"
"fmt"
"math/rand"
"time"

"golang.org/x/sync/errgroup"
)

func init() {
rand.Seed(time.Now().UnixNano())
}

func random(min, max int) int {
if min == 0 {
max = max + 1
}

return rand.Intn(max) + min
}

func main() {
eg, ctx := errgroup.WithContext(context.Background())

for i := 1; i <= 2; i++ {
i := i

eg.Go(func() error {
return child(ctx, eg, i)
})
}

if err := eg.Wait(); err != nil {
fmt.Println(err)
}
}

func child(ctx context.Context, eg *errgroup.Group, id int) error {
for i := 1; i <= 5; i++ {
i := i

eg.Go(func() error {
for ctx.Err() == nil {
a, b := random(0, 3), random(0, 3)

if a == 0 && b == 0 {
return fmt.Errorf("MIAN:%d - CHILD:%d => (%d-%d)\n", id, i, a, b)
}

// Do the work
fmt.Printf("MIAN:%d - CHILD:%d => (%d-%d)\n", id, i, a, b)
}

return nil
})
}

return nil
}

Testler


MIAN:1 - SUB:1 => (0-3)
MIAN:1 - SUB:1 => (1-0)
MIAN:1 - SUB:2 => (0-2)
MIAN:2 - SUB:1 => (1-2)
MIAN:2 - SUB:2 => (3-2)
MIAN:1 - SUB:1 => (0-0)
MIAN:1 - SUB:1 => (0-2)
MIAN:1 - SUB:4 => (1-3)
MIAN:1 - SUB:1 => (3-3)
MIAN:1 - SUB:1 => (0-0)

MIAN:2 - SUB:2 => (2-2)
MIAN:2 - SUB:1 => (2-3)
MIAN:1 - SUB:2 => (3-3)
MIAN:1 - SUB:3 => (0-0)

MIAN:1 - SUB:1 => (3-2)
MIAN:2 - SUB:1 => (0-0)