Goroutine akan tidur lebih awal

PHPz
Lepaskan: 2024-02-09 11:30:31
ke hadapan
1118 orang telah melayarinya

Goroutine 过早进入睡眠状态

editor php Banana ada di sini untuk memperkenalkan kepada anda masalah biasa, iaitu, Goroutine tidur lebih awal. Menggunakan Goroutine untuk melaksanakan tugas secara serentak dalam bahasa Go adalah sangat cekap, tetapi kadangkala kita menghadapi situasi di mana Goroutine memasuki keadaan tidur sebelum melaksanakan tugas, menyebabkan tugasan gagal diteruskan seperti biasa. Artikel ini akan menerangkan punca masalah ini secara terperinci dan menyediakan penyelesaian untuk membantu semua orang memahami dan menggunakan Goroutine dengan lebih baik.

Kandungan soalan

Kod:

package main

import (
    "fmt"
    "time"
)

func main() {
    link := make(chan bool)
    stop := make(chan bool)
    go a(link, stop)
    go b(link)
    <-stop
}

func a(link chan bool, stop chan bool) {
    for i := 0; i < 20; i++ {
        time.Sleep(1 * time.Second)
        link <- true
    }
    stop <- true
}

func b(link chan bool) {
    go func() {
        <-link
        fmt.Println("A")
    }()
    go func() {
        <-link
        fmt.Println("B")
    }()
}
Salin selepas log masuk

Kod ini tidak melakukan sesuatu yang istimewa, saya hanya mahu memahami saluran dan goroutine. Tetapi ada masalah dan coroutine tertidur selepas menggelung dua kali dan apl itu ranap.

Mari kita analisa apa yang dilakukannya - setiap saat mesej dihantar ke link。函数 b 在两个地方接收它,因此调用了 print a dan b. Jadi pada asasnya setiap detik a dan b harus muncul dalam konsol. Tetapi atas sebab yang tidak saya ketahui, ia tidak berlaku, program mencetak a dan b sekali dan kemudian ranap. Saya mungkin tidak memahami konsep itu dengan baik (golang benar-benar tidak intuitif), jadi saya harap saya boleh mendapatkan jawapannya di sini.

Penyelesaian

Menghantar ke saluran tanpa buffer hanya akan berjaya jika terdapat goroutine yang menerima data daripadanya. Untuk dua hantaran pertama, terdapat blok goroutine dari link 通道接收。但是它们收到一个值并终止,并且不再有任何 goroutine 从 link 接收,因此第三个发送到 link . Memandangkan tiada goroutine lain berjalan, program menemui jalan buntu.

Atas ialah kandungan terperinci Goroutine akan tidur lebih awal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
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!