Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan ciri pembatalan konteks dalam Goroutine?

Bagaimana untuk menggunakan ciri pembatalan konteks dalam Goroutine?

王林
王林asal
2024-06-06 10:29:43506semak imbas

Gunakan ciri pembatalan konteks dalam Pergi untuk membatalkan Goroutine yang sedang berjalan dengan anggun: Gunakan pakej konteks untuk mencipta konteks dengan tamat masa. Gunakan tangguh untuk membatalkan konteks apabila fungsi kembali. Gunakan pernyataan pilih dalam Goroutine untuk mendengar acara pembatalan.

如何在 Goroutine 中使用上下文取消功能?

Bagaimana untuk menggunakan fungsi pembatalan konteks dalam Goroutine?

Dalam Go, mekanisme pembatalan konteks membolehkan kami membatalkan Goroutine yang sedang berjalan dengan anggun apabila syarat tertentu dipenuhi. Ini berguna dalam tugas yang perlu dijalankan di latar belakang tetapi boleh dibatalkan jika perlu.

Senario penggunaan

Pembatalan konteks amat sesuai untuk senario berikut:

  • Operasi pembatalan pengguna
  • Tugas tamat masa
  • Perincian pengendalian ralat apabila kandungan sumber

Untuk menggunakan pembatalan konteks, anda perlu menggunakan pakej context. Seperti yang ditunjukkan di bawah:

package main

import (
    "context"
    "fmt"
    "time"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    go func() {
        for {
            select {
            case <-ctx.Done():
                fmt.Println("Context cancelled!")
                return
            default:
                fmt.Println("Working...")
                time.Sleep(1 * time.Second)
            }
        }
    }()

    time.Sleep(10 * time.Second)
}
Dalam contoh ini:

context 包。如下所示:

rrreee

在这个示例中:

  • context.WithTimeout() 创建了一个新的上下文,它将超时 5 秒。
  • defer cancel() 确保在 main 函数返回时取消上下文。
  • Goroutine 将运行一个无限循环,在 ctx.Done() 通道收到信号时退出。
  • 主流程将在 10 秒后退出,此时 Goroutine 将被取消。

实战案例

在真实的应用程序中,上下文取消可以用于以下任务:

  • Web 服务器: 当用户取消请求时取消 HTTP 处理程序。
  • 数据库连接: 当数据库连接不再需要时取消数据库查询。
  • 文件 I/O: 当文件传输需要取消时取消 I/O 操作。

注意事项

请注意以下注意事项:

  • 使用 context.Done() 通道来监听取消事件。
  • 应该在 Goroutine 中使用 defer cancel() 来在函数返回时取消上下文。
  • 在需要时使用 selectcontext.WithTimeout() mencipta konteks baharu yang akan tamat masa selama 5 saat.
defer cancel() memastikan konteks dibatalkan apabila fungsi utama kembali. 🎜🎜Groutine akan menjalankan gelung tak terhingga dan keluar apabila saluran ctx.Done() menerima isyarat. 🎜🎜Proses utama akan keluar selepas 10 saat, dan Goroutine akan dibatalkan pada masa ini. 🎜🎜🎜🎜Real Case 🎜🎜🎜Dalam aplikasi sebenar, pembatalan konteks boleh digunakan untuk tugasan berikut: 🎜🎜🎜🎜Pelayan Web: 🎜 Batalkan pengendali HTTP apabila pengguna membatalkan permintaan. 🎜🎜🎜Sambungan Pangkalan Data: 🎜 Batalkan pertanyaan pangkalan data apabila sambungan pangkalan data tidak lagi diperlukan. 🎜🎜🎜Fail I/O: 🎜 Batalkan operasi I/O apabila pemindahan fail perlu dibatalkan. 🎜🎜🎜🎜Nota🎜🎜🎜Sila ambil perhatian yang berikut: 🎜🎜🎜Gunakan saluran context.Done() untuk mendengar acara pembatalan. 🎜🎜Anda harus menggunakan defer cancel() dalam Goroutine untuk membatalkan konteks apabila fungsi itu kembali. 🎜🎜Gunakan pernyataan select untuk mendengar acara pembatalan dalam Goroutine apabila diperlukan. 🎜🎜

Atas ialah kandungan terperinci Bagaimana untuk menggunakan ciri pembatalan konteks dalam Goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn