Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menghentikan Pelaksanaan Go Goroutine Selepas Tamat Masa?

Bagaimana untuk Menghentikan Pelaksanaan Go Goroutine Selepas Tamat Masa?

Barbara Streisand
Barbara Streisandasal
2024-12-24 11:21:15228semak imbas

How to Stop a Go Goroutine Execution After a Timeout?

Menghentikan Pelaksanaan Goroutine pada Tamat Masa

Dalam Go, goroutine menyediakan cara yang ringan untuk melaksanakan kod serentak. Walau bagaimanapun, kadangkala anda perlu menghentikan goroutine selepas tempoh masa tertentu.

Masalah:

Seorang pengguna menghadapi isu di mana goroutine terus melaksanakan walaupun selepas tamat masa telah ditetapkan. Mereka menjangkakan goroutine akan berhenti serta-merta apabila mencapai tamat masa, tetapi sebaliknya, ia mencetak mesej tambahan. Berikut ialah kod contoh:

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

    go func() {
        time.Sleep(10 * time.Second)
        fmt.Println("test")
        fmt.Println("test1")
        ch <- Response{data: "data", status: true}
    }()

    select {
    case <-ch:
        fmt.Println("Read from ch")
        res := <-ch
        return res.data, res.status
    case <-time.After(50 * time.Millisecond):
        return "Timed out", false
    }
}

Output Jangkaan:

  • Tamat masa

Output Sebenar:

  • Bermasa keluar
  • ujian
  • ujian1

Analisis:

Masalah timbul kerana tamat masa ditetapkan pada bahagian penerima daripada saluran ch, bukan pada hujung penghantaran. Walaupun tamat masa dengan betul mengenal pasti bahawa tiada data diterima dalam masa 50 milisaat, ia tidak menghalang goroutine daripada melaksanakan selanjutnya dan menghantar data pada saluran selepas itu.

Penyelesaian:

Memandangkan tidak mungkin untuk mengganggu secara langsung pelaksanaan goroutine dalam Go, pendekatan alternatif adalah diperlukan:

  • Gunakan saluran tidak buffer, yang menyekat penghantaran dan memaksa goroutine menunggu sehingga saluran sedia untuk menerima.
  • Gunakan konteks dengan pembatalan dan hantarkannya ke dalam goroutine. Apabila tamat masa berlaku, batalkan konteks dan goroutine harus menyemak konteks dan kembali awal.
  • Gunakan teknik penyegerakan tersuai, seperti mutex atau kumpulan tunggu, untuk mengawal pelaksanaan goroutine dan memastikan penamatan tepat pada masanya.

Atas ialah kandungan terperinci Bagaimana untuk Menghentikan Pelaksanaan Go Goroutine Selepas Tamat Masa?. 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