Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengisyaratkan Rutin Pergi untuk Berhenti tanpa Menyekat?

Bagaimana untuk Mengisyaratkan Rutin Pergi untuk Berhenti tanpa Menyekat?

Patricia Arquette
Patricia Arquetteasal
2024-10-28 05:00:30128semak imbas

How to Signal a Go Routine to Halt without Blocking?

Mengisyaratkan Rutin Pergi untuk Berhenti

Dalam senario ini, rutin pergi perlu diarahkan untuk menghentikan operasi. Cabaran utama terletak pada mencapai isyarat ini tanpa memperkenalkan tingkah laku menyekat.

Penyelesaian yang dicadangkan melibatkan penggunaan saluran sekunder. Walau bagaimanapun, penggunaan saluran konvensional akan membawa kepada penyekatan jika rutin go cuba menerima isyarat daripada saluran ini semasa memproses data secara aktif.

Menggunakan Kes Terpilih

Untuk mengelakkan sekatan, kod tersebut boleh memanfaatkan kes pilih dengan klausa lalai. Ini membolehkan rutin go meneruskan pemprosesan data sehingga isyarat diterima daripada saluran kedua:

<code class="go">go func() {
    for {
        fmt.Println("working")
        time.Sleep(1 * time.Second)
        select {
        case <-tooLate:
            fmt.Println("stopped")
            return
        case proCh <- "processed": //this why it won't block the goroutine if the timer expirerd.
        default: // adding default will make it not block
        }
        fmt.Println("done here")
    }
}()</code>

Dengan menggunakan klausa lalai, rutin go boleh mengelak daripada menyekat walaupun pemasa tamat tempoh.

Menggunakan penyegerakan.Cond

Pendekatan lain melibatkan penggunaan penyegerakan.Cond dan bukannya saluran. Pemboleh ubah keadaan menyediakan cara untuk menunggu dan memberi isyarat merentas gorouti.

Kesimpulan

Dengan sama ada saluran kedua dengan klausa lalai atau penyegerakan.Cond, anda boleh memberi isyarat kepada rutin pergi untuk berhenti dengan berkesan berlari tanpa perlu menyekat tingkah laku.

Atas ialah kandungan terperinci Bagaimana untuk Mengisyaratkan Rutin Pergi untuk Berhenti tanpa Menyekat?. 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