Mengapakah program Go saya kadangkala mencetak hasil jumlah sebelum \'paparkan mesej pertama\'?

DDD
Lepaskan: 2024-10-30 18:16:03
asal
738 orang telah melayarinya

 Why does my Go program sometimes print the sum result before the

Go Concurrency dan Kekeliruan Saluran: Memahami Perintah Pelaksanaan Goroutine

Dalam Go, concurrency dicapai melalui goroutin, benang ringan yang berjalan serentak dalam satu satu proses. Saluran menyediakan cara untuk berkomunikasi antara goroutine. Walau bagaimanapun, memahami cara goroutine dan saluran berinteraksi boleh menjadi mencabar, terutamanya untuk pemula.

Artikel ini meneroka titik kekeliruan biasa yang berkaitan dengan perintah pelaksanaan goroutine dan komunikasi saluran. Contoh atur cara yang disediakan:

<code class="go">package main

import "fmt"

func display(msg string, c chan bool) {
    fmt.Println("display first message:", msg)
    c <- true
}

func sum(c chan bool) {
    sum := 0
    for i := 0; i < 10000000000; i++ {
        sum++
    }
    fmt.Println(sum)
    c <- true
}

func main() {
    c := make(chan bool)

    go display("hello", c)
    go sum(c)
    <-c
}</code>
Salin selepas log masuk

Atur cara ini dijangka akan mencetak "paparkan mesej pertama: hello" sebagai output pertama, diikuti dengan hasil pengiraan jumlah. Walau bagaimanapun, dalam beberapa kes, pengiraan jumlah tamat sebelum fungsi paparan menghantar data ke saluran.

Penjelasan:

Penjadual dalam Go menentukan susunan goroutine dilaksanakan. Ia bukan deterministik, bermakna perintah pelaksanaan mungkin berbeza-beza bergantung pada faktor seperti perkakasan dan sistem pengendalian. Dalam contoh ini:

  1. Fungsi utama mencipta dua goroutine: paparan dan jumlah.
  2. Penjadual memilih untuk beralih kepada goroutine paparan dahulu, yang mencetak baris "paparkan mesej pertama" .
  3. Paparan goroutine disekat apabila ia cuba menghantar data ke saluran (c <- benar) kerana belum ada penerima.
  4. Penjadual memilih untuk menjalankan jumlah goroutine, yang melaksanakan gelung pengiraan yang mahal.
  5. Setelah pengiraan jumlah selesai, goroutine jumlah menghantar data ke saluran.
  6. Fungsi utama menerima data daripada saluran dan keluar.

Walau bagaimanapun, penjadual juga boleh melaksanakan jumlah goroutine hingga selesai sebelum paparan goroutine menghantar data ke saluran. Dalam kes ini, outputnya ialah:

10000000000
display first message: hello
Salin selepas log masuk

Penyelesaian:

Untuk memastikan mesej paparan dicetak sebelum hasil jumlah, seseorang boleh menggunakan hasil saluran untuk menerima keputusan pertama dan keluar dari program. Fungsi utama yang diubah suai ialah:

<code class="go">func main() {
    result := make(chan string)

    go display("hello", result)
    go sum(result)
    fmt.Println(<-result)
}</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah program Go saya kadangkala mencetak hasil jumlah sebelum \'paparkan mesej pertama\'?. 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
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!