Cara menggunakan konteks untuk melaksanakan kawalan tamat masa dalam Go
Pengenalan:
Apabila menulis program serentak, kawalan tamat masa ialah teknologi yang sangat penting. Apabila program perlu melakukan operasi, jika operasi tidak dapat diselesaikan dalam masa yang ditetapkan, kami berharap dapat mengganggunya dan melakukan pemprosesan lain. Dalam bahasa Go, kita boleh menggunakan pakej konteks untuk melaksanakan kawalan tamat masa.
import ( "context" "fmt" "time" )
Seterusnya, kami mentakrifkan fungsi yang melakukan beberapa operasi yang memakan masa. Dalam fungsi, kami menggunakan penyataan pilih untuk memantau sama ada isyarat Done() konteks dicetuskan, jika ia dicetuskan, operasi semasa boleh terganggu.
func doSomething(ctx context.Context) { // 模拟一个耗时操作 time.Sleep(5 * time.Second) select { case <-ctx.Done(): fmt.Println("操作被中断") return default: fmt.Println("操作执行成功") } }
Seterusnya, kita perlu mencipta objek konteks dalam fungsi utama dan menetapkan tamat masa kepada 3 saat.
func main() { // 创建一个context对象,并设置超时时间为3秒 ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second) defer cancel() // 在新的goroutine中执行操作,并传入context对象 go doSomething(ctx) // 等待3秒,让操作有足够的时间执行 time.Sleep(3 * time.Second) }
Dalam contoh di atas, kami menggunakan fungsi WithTimeout untuk mencipta objek konteks yang mengandungi tamat masa dan menghantarnya ke dalam fungsi doSomething. Kemudian kita tunggu 3 saat dalam fungsi utama untuk memberikan fungsi doSomething cukup masa untuk dilaksanakan. Jika fungsi doSomething dilaksanakan dalam masa 3 saat, "Operasi telah berjaya dilaksanakan" akan menjadi output jika ia melebihi 3 saat dan isyarat tamat masa dicetuskan, "Operasi telah terganggu" akan dikeluarkan.
func worker(ctx context.Context, name string) { for { select { case <-ctx.Done(): fmt.Println(name, "被中断") return default: fmt.Println(name, "正常执行") time.Sleep(time.Second) } } } func main() { ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second) defer cancel() go worker(ctx, "worker1") go worker(ctx, "worker2") go worker(ctx, "worker3") // 等待3秒钟,观察goroutine的执行情况 time.Sleep(3 * time.Second) }
Dalam kod di atas, kami mentakrifkan fungsi pekerja, yang akan terus mengeluarkan nama goroutine semasa dan tidur selama satu saat. Kemudian kami memulakan goroutine tiga pekerja dalam fungsi utama dan lulus dalam objek konteks yang sama. Kami menggunakan fungsi WithTimeout untuk mencipta objek konteks yang mengandungi tamat masa dan menghantarnya ke dalam fungsi pekerja. Kemudian kami menunggu 3 saat dalam fungsi utama untuk memerhatikan pelaksanaan goroutine. Apabila melebihi 3 saat, isyarat tamat masa dicetuskan dan goroutine akan mengeluarkan "terganggu".
Ringkasan:
Dengan menggunakan pakej konteks, kami boleh melaksanakan kawalan tamat masa secara elegan untuk operasi serentak. Apabila menulis program serentak, penggunaan konteks yang rasional bukan sahaja dapat meningkatkan kebolehpercayaan program, tetapi juga mengelakkan penyekatan jangka panjang dan meningkatkan prestasi program. Saya harap artikel ini akan membantu anda memahami kawalan tamat masa dalam pengaturcaraan serentak.
Atas ialah kandungan terperinci Cara menggunakan konteks untuk melaksanakan kawalan tamat masa dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!