Bagaimana untuk Mengisyaratkan Rutin Pergi untuk Berhenti tanpa Menyekat?

Patricia Arquette
Lepaskan: 2024-10-28 05:00:30
asal
126 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!