Sobes.tech
Junior — Middle

Lehetséges, hogy egy goroutine megszakad vagy önállóan leáll?

sobes.tech MI

Válasz az MI-től

Go-ban a gorutina végrehajtása több esetben is önállóan befejeződhet:

  • A gorutina befejezte a funkcióját. Amint a gorutina által futtatott funkció véget ér, a gorutina lezárul.
  • Pánik a gorutina belsejében. Ha pánik történik a gorutina belsejében és nem kezelik, az váratlanul befejeződik.
  • A megszakítás a kontextus (context) segítségével. Ha a gorutina figyeli a megszakítási jelet a context.Context-en keresztül és megkapja, helyesen befejeződhet.

Fontos megérteni, hogy a gorutinákat nem lehet külsőleg kényszeríteni a megszakításra — saját magadnak kell megvalósítanod a leállási mechanizmust, például csatornák vagy kontextusok segítségével.

Példa a kontextus használatára a gorutina megszakítására:

ctx, cancel := context.WithCancel(context.Background())

go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Gorutina befejeződött")
            return
        default:
            // munka
        }
    }
}(ctx)

// Egy időpontban meghívjuk a cancel()
t
cancel()

Így a gorutina vagy saját maga fejeződik be a munka végén, vagy a megszakítási jelzés hatására, ha ez elő van írva.