Soalan:
Anda sedang membina alat yang mengendalikan berbilang panggilan HTTP dalam goroutine serentak. Untuk mengelakkan senario pelaksanaan yang tidak ditentukan, anda mencari cara untuk membatalkan goroutine selepas luput masa tertentu.
Penyelesaian:
Sementara pendekatan mencipta goroutine untuk tidur untuk tempoh tertentu dan menghantar mesej siaran untuk membatalkan goroutine lain nampaknya logik, nampaknya ada masalah dengan pelaksanaan goroutine dalam senario ini.
Untuk menangani cabaran ini, pertimbangkan untuk memanfaatkan pakej konteks dalam Go. Ia menawarkan cara yang berkesan untuk mengendalikan tamat masa dan pembatalan konteks untuk gorouti.
Coretan Kod:
Berikut ialah contoh menggunakan pakej konteks untuk pengurusan tamat masa bagi gorouti:
package main import ( "context" "fmt" "time" ) func test(ctx context.Context) { t := time.Now() select { case <-time.After(1 * time.Second): fmt.Println("overslept") case <-ctx.Done(): fmt.Println("cancelled") } fmt.Println("used:", time.Since(t)) } func main() { ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) go test(ctx) // cancel context after 30 milliseconds time.Sleep(30 * time.Millisecond) cancel() }
Kod ini mencipta konteks dengan tamat masa 50 milisaat. Satu goroutine kemudiannya dilancarkan untuk melaksanakan fungsi ujian, melepasi konteks. Dalam fungsi ujian, pernyataan pilih menunggu sama ada tamat masa berlaku atau konteks dibatalkan. Selepas 30 milisaat, konteks dibatalkan, menyebabkan goroutine selesai dan mencetak "dibatalkan."
Atas ialah kandungan terperinci Bagaimanakah Pakej `konteks` Go Boleh Digunakan untuk Tamat Masa Goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!