Rumah >pembangunan bahagian belakang >Golang >Mengapa Anda Perlu Sentiasa Menangguhkan Membatalkan Konteks dalam Go?
Kegagalan Membatalkan Konteks: Akibat dan Penyelesaian
Dalam landskap serentak Go, Konteks mengawal seumur hidup dan tingkah laku goroutin. Ia menyediakan cara untuk menyebarkan tarikh akhir, isyarat pembatalan dan maklumat penting lain. Walau bagaimanapun, kegagalan membatalkan Konteks dengan betul boleh membawa kepada akibat yang tidak diingini.
Pertimbangkan coretan kod berikut:
func Call(ctx context.Context, payload Payload) (Response, error) { req, err := http.NewRequest(...) // Some code that creates request from payload ctx, cancel = context.WithTimeout(ctx, time.Duration(3) * time.Second) defer cancel() return http.DefaultClient.Do(req) }
Di sini, Konteks baharu dibuat dengan tamat masa 3 saat. Tanpa penyataan defer cancel(), fungsi itu kembali tanpa membatalkan Konteks secara eksplisit. Ini mencetuskan amaran daripada pergi vet:
fungsi batal dikembalikan mengikut konteks.WithTimeout harus dipanggil, bukan dibuang, untuk mengelakkan kebocoran konteks
Jadi, apa yang berlaku jika Konteks tidak dibatalkan? Peninggalan ini mewujudkan "kebocoran" dalam sistem. Goroutine yang bertanggungjawab untuk mengendalikan pembatalan Konteks kekal aktif selama-lamanya, walaupun ia tidak mempunyai tujuan. Sumber terbuang ini boleh mengakibatkan overhed memori yang ketara jika ia kerap berlaku dalam program.
Untuk mengelakkan kebocoran Konteks, adalah dianggap amalan terbaik untuk menangguhkan pembatalan serta-merta( ) selepas mencipta Konteks baharu dengan WithCancel() atau WithTimeout(). Ini memastikan bahawa logik pembatalan dilaksanakan sebaik sahaja fungsi kembali, tanpa mengira sebarang pemulangan awal atau pengecualian.
Ringkasnya, pengabaian untuk membatalkan Konteks boleh menyebabkan kebocoran memori dengan membiarkan goroutine berjalan tanpa had. Untuk mengelakkan ini, sentiasa menangguhkan fungsi pembatalan serta-merta selepas penciptaan Konteks baharu dengan WithCancel() atau WithTimeout().
Atas ialah kandungan terperinci Mengapa Anda Perlu Sentiasa Menangguhkan Membatalkan Konteks dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!