Sobes.tech
Senior

Co se stane, pokud předáte původní kontext HTTP požadavku do GoRoutine?

sobes.tech AI

Odpověď od AI

Pokud předáte původní kontext (context.Context) HTTP požadavku do samostatné gorutiny, pak při zrušení nebo vypršení tohoto kontextu (například když klient uzavře spojení nebo vyprší časový limit) bude kontext v gorutině také zrušen. To může vést k neočekávanému přerušení práce gorutiny, pokud na tento kontext závisí.

Proto, pokud má gorutina pracovat nezávisle na životním cyklu HTTP požadavku, je vhodné vytvořit samostatný kontext (například pomocí context.Background() nebo context.WithCancel()), aby se zabránilo předčasnému ukončení. Jinak je užitečné použití původního kontextu pro správné řízení doby života operací spojených s požadavkem.

Příklad:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Tato gorutina skončí, pokud bude ctx zrušen
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Práce dokončena")
        case <-ctx.Done():
            fmt.Println("Kontekst zrušen")
        }
    }(ctx)
    w.Write([]byte("Odpověď odeslána"))
}