Rumah > pembangunan bahagian belakang > Golang > Adakah ini masuk akal dengan defer cancel() ?

Adakah ini masuk akal dengan defer cancel() ?

王林
Lepaskan: 2024-02-12 13:45:06
ke hadapan
925 orang telah melayarinya

这对于 defer cancel() 有意义吗?

Adakah kandungan soalan

masuk akal dalam http.HandlerFunc 中我得到了这个。但我的问题是:在应用超时上下文之后放置 defer cancel()?

Sebab pilihan bawah akan terus mendengar sehingga konteks selesai. Dan kelewatan akan dilaksanakan selepas konteks selesai. Tetapi adakah itu dilakukan? :)

//  Apply timeout context
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, time.Duration(time.Duration(match_route.timeout) * time.Second))
defer cancel() // <--- does this make sense

go func(){
    match_route.handler(w, r.WithContext(ctx))
    cancel()
}()

select {
case <-ctx.Done():
    if ctx.Err() == context.DeadlineExceeded {
        http.Error(w, "Timeout", http.StatusRequestTimeout)
    }
}
Salin selepas log masuk

Penyelesaian

Ya, saya rasa ini masuk akal, sebenarnya gunakan pernyataan defer cancel() 的目的是确保调用 cancel 函数来释放与上下文关联的资源,无论函数如何退出,在您的示例中, cancel() 函数被推迟到 http.HandlerFunc 完成后或上下文完成时执行,因此 go func() 负责使用提供的上下文执行 match_route.handler 函数,然后调用 cancel()显式取消上下文,select untuk menunggu konteks selesai dan jika konteks selesai kerana tarikh akhir telah dilampaui maka respons ralat akan dikembalikan!

Atas ialah kandungan terperinci Adakah ini masuk akal dengan defer cancel() ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan