Sobes.tech
Senior

HTTP сурооңун түпкү контекстин GoRoutineга өткөрсөңүз, эмне болот?

sobes.tech AI

AIден жооп

Эгер сиз HTTP сурооңуздун түпкү контекстин (context.Context) башка GoRoutineга өткөрүп берсеңиз, анда бул контекст ал бул контекстти жокко чыгарганда же мөөнөтү өтүп кеткенде (мисалы, кардар байланышты үзгөндө же күтүүнүн мөөнөтү аяктагында) ошол GoRoutine ичиндеги контекст да жокко чыгарылат. Бул күтүүсүз үзгүлтүккө алып келиши мүмкүн, эгер ал бул контекстке көз каранды болсо.

Ошондуктан, эгер GoRoutine HTTP сурооңунун жашоо циклинен көз каранды болбошу керек болсо, алгачкы контекстти (context.Background() же context.WithCancel()) түзүү сунушталат, эрте бүтүүнүн алдын алуу үчүн. Болбосо, оригиналдуу контекстти колдонуу суроо менен байланышкан операциялардын жашоо мөөнөтүн туура башкаруу үчүн пайдалуу.

Мисал:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Бул GoRoutine, эгер ctx жокко чыгарылса, аяктайт
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Иш аяктады")
        case <-ctx.Done():
            fmt.Println("Контекст жокко чыгарылды")
        }
    }(ctx)
    w.Write([]byte("Жооп жөнөтүлдү"))
}