Rumah > Artikel > pembangunan bahagian belakang > Mekanisme tamat masa dan pembatalan Goroutine dan Saluran di Golang
Masa tamat dan mekanisme pembatalan Goroutine dan Saluran di Golang
Di Golang, Goroutine dan Saluran adalah komponen penting pengaturcaraan serentak. Goroutines ialah pelaksanaan utas ringan dalam bahasa Go yang membolehkan kami melaksanakan berbilang tugas secara serentak dengan mudah. Saluran ialah mekanisme komunikasi antara Goroutines, digunakan untuk memindahkan data dan menyegerakkan tugas.
Dalam pengaturcaraan serentak sebenar, kadangkala kita perlu mengawal masa pelaksanaan Goroutines, atau membatalkan pelaksanaan Goroutines di bawah syarat tertentu tertentu. Untuk mencapai fungsi ini, Golang menyediakan mekanisme tamat masa dan pembatalan. Di bawah, kami akan memperkenalkan secara terperinci cara menggunakan mekanisme ini di Golang dan memberikan contoh kod yang sepadan.
Mekanisme tamat masa Goroutines boleh memastikan bahawa tugasan dilaksanakan dalam masa yang ditetapkan Jika tugasan tidak selesai selepas masa yang ditetapkan, tugasan akan dibatalkan kerana tamat masa. Golang menyediakan pakej context
untuk melaksanakan fungsi ini. Berikut ialah contoh kod yang menggunakan mekanisme tamat masa Goroutines: context
包来实现这个功能。下面是一个使用 Goroutines 超时机制的示例代码:
package main import ( "context" "fmt" "time" ) func worker(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("任务被取消,退出 Goroutine") return default: fmt.Println("正在执行任务...") time.Sleep(1 * time.Second) } } } func main() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() go worker(ctx) time.Sleep(10 * time.Second) }
在上面的代码中,我们使用 context.WithTimeout
函数创建了一个具有 5 秒超时时间的上下文对象,然后调用 go worker(ctx)
启动了一个 Goroutine 执行任务。在任务执行过程中,通过 select
语句监听 ctx.Done()
通道,如果收到取消信号则退出 Goroutine。
注意,在 main
函数中我们通过 time.Sleep(10 * time.Second)
设置了一个 10 秒等待,这是为了确保 Goroutine 执行超时。运行以上代码,我们可以观察到在 5 秒超时时间到达后,worker
Goroutine 会收到取消信号并退出。
Goroutines 的取消机制可以在特定条件下取消执行中的任务。我们同样可以使用 context
包来实现这个功能。看下面的代码示例:
package main import ( "context" "fmt" "time" ) func worker(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("任务被取消,退出 Goroutine") return default: fmt.Println("正在执行任务...") time.Sleep(1 * time.Second) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() go worker(ctx) time.Sleep(5 * time.Second) cancel() fmt.Println("取消任务...") time.Sleep(2 * time.Second) }
在上面的代码中,我们使用 context.WithCancel
函数创建了一个取消上下文对象,然后调用 go worker(ctx)
启动了一个 Goroutine 执行任务。在任务执行过程中,通过 select
语句监听 ctx.Done()
通道,如果收到取消信号则退出 Goroutine。
在 main
函数中,我们通过 time.Sleep(5 * time.Second)
设置了一个 5 秒等待,然后调用 cancel()
取消任务。运行以上代码,我们可以观察到在调用 cancel()
后,worker
Goroutine 会立即收到取消信号并退出。
总结:
通过上述代码示例,我们学习了 Golang 中 Goroutines 和 Channels 的超时和取消机制。通过使用 context
rrreee
context.WithTimeout
untuk mencipta objek konteks dengan tamat masa 5 saat, dan kemudian memanggil go worker(ctx) memulakan tugas pelaksanaan Goroutine. Semasa pelaksanaan tugas, dengar saluran ctx.Done()
melalui pernyataan select
dan keluar dari Goroutine jika isyarat pembatalan diterima. Perhatikan bahawa dalam fungsi utama
kami menetapkan menunggu 10 saat melalui time.Sleep(10 * time.Second)
, iaitu untuk memastikan masa pelaksanaan Goroutine keluar. Menjalankan kod di atas, kita dapat melihat bahawa selepas tamat masa 5 saat mencapai, pekerja
Goroutine akan menerima isyarat pembatalan dan keluar. 🎜context
untuk mencapai fungsi ini. Lihat contoh kod di bawah: 🎜rrreee🎜Dalam kod di atas, kami menggunakan fungsi context.WithCancel
untuk mencipta objek konteks pembatalan, dan kemudian panggil go worker(ctx)
untuk memulakannya Cipta Goroutine untuk melaksanakan tugas. Semasa pelaksanaan tugas, dengar saluran ctx.Done()
melalui pernyataan select
dan keluar dari Goroutine jika isyarat pembatalan diterima. 🎜🎜Dalam fungsi utama
, kami menetapkan 5 saat menunggu melalui time.Sleep(5 * time.Second)
dan kemudian panggil cancel() kod> kod> Batalkan tugas. Menjalankan kod di atas, kita dapat melihat bahawa selepas memanggil <code>cancel()
, worker
Goroutine akan segera menerima isyarat pembatalan dan keluar. 🎜🎜Ringkasan: 🎜🎜Melalui contoh kod di atas, kami mempelajari mekanisme tamat masa dan pembatalan Goroutine dan Saluran di Golang. Dengan menggunakan pakej context
, kami boleh melaksanakan operasi tamat masa tugas dan pembatalan untuk mengawal pelaksanaan tugas serentak dengan lebih baik. Ini sangat berguna dalam pengaturcaraan serentak sebenar, dan boleh memastikan pelaksanaan tugas yang betul dan pelepasan sumber. 🎜🎜Saya harap artikel ini akan membantu anda memahami mekanisme tamat masa dan pembatalan Goroutines dan Saluran di Golang, dan saya harap anda boleh menggunakannya secara fleksibel dalam pembangunan sebenar. Terima kasih kerana membaca! 🎜
Atas ialah kandungan terperinci Mekanisme tamat masa dan pembatalan Goroutine dan Saluran di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!