Membatalkan Goroutines selepas Had Masa
Dalam senario ujian beban, mengawal tempoh pelaksanaan Goroutines adalah penting. Berikut ialah pendekatan yang berkesan untuk mencapai perkara ini.
Pertimbangkan coretan kod berikut yang mengurus permintaan HTTP dalam Goroutines:
func attack(cfg AttackConfig) { // some code ... var ar attackResponse ch := make(chan uint8, 8) go func() { time.Sleep(cfg.Duration * time.Second) ch <- CALL_TIME_RAN_OUT }() for { if atomic.LoadInt32(&currConnections) < atomic.LoadInt32(&maxConnections) - 1 { go httpPost(cfg, &ar, ch) } switch <-ch { // some other cases ... case CALL_TIME_RAN_OUT: fmt.Printf("%d seconds have elapsed. Shutting down!", cfg.Duration) return } } }
Walau bagaimanapun, Goroutines daripada httpPost() terus berjalan selepas cfg.Duration yang ditentukan telah berlalu.
Untuk menangani isu ini, anda boleh memanfaatkan pakej konteks Go. Dengan menghantar objek konteks.Konteks ke Goroutines anda, anda boleh membatalkan Goroutines tersebut apabila tamat masa yang ditentukan telah dicapai.
Berikut ialah versi semakan kod anda menggunakan pakej konteks:
import ( "context" "fmt" "golang.org/x/net/context" "time" ) func attack(cfg AttackConfig) { // some code ... var ar attackResponse // Define a timeout context ctx, cancel := context.WithTimeout(context.Background(), cfg.Duration*time.Second) defer cancel() go func() { time.Sleep(cfg.Duration * time.Second) cancel() }() for { if atomic.LoadInt32(&currConnections) < atomic.LoadInt32(&maxConnections) - 1 { go httpPost(ctx, cfg, &ar) } select { // some other cases ... case <-ctx.Done(): fmt.Printf("%d seconds have elapsed. Shutting down!", cfg.Duration) return } } } func httpPost(ctx context.Context, cfg AttackConfig, a *attackResponse) { // some code here to create HTTP client ... for { // some code to make HTTP call ... select { case <-ctx.Done(): return default: } } }
Dengan pengubahsuaian ini, apabila cfg.Duration yang ditentukan tamat tempoh, saluran ctx.Done() ditutup, menandakan pembatalan httpPost() Goroutines, yang kemudiannya akan kembali.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membatalkan Goroutine dengan Anggun Selepas Had Masa Ditentukan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!