Jadual Kandungan
Isi soalan
解决方法
Rumah pembangunan bahagian belakang Golang Memahami tingkah laku saluran menyekat golang dengan menulis beberapa kali ke saluran

Memahami tingkah laku saluran menyekat golang dengan menulis beberapa kali ke saluran

Feb 09, 2024 pm 02:27 PM
pembangunan golang

通过对通道进行多次写入来理解 golang 阻塞通道行为

Dalam artikel ini, editor PHP Youzi akan memperkenalkan kepada anda cara memahami tingkah laku golang menyekat saluran dengan menulis ke saluran berkali-kali. Dalam golang, saluran adalah mekanisme penting untuk menghantar data antara coroutine. Apabila saluran penuh, operasi tulis disekat sehingga saluran menjadi bebas. Kami akan menunjukkan tingkah laku ini dengan contoh mudah dan menerangkan cara menyekat saluran berfungsi dan cara menggunakannya. Sama ada anda seorang pemula atau pembangun golang yang berpengalaman, anda boleh memperoleh pengetahuan berguna dan pengalaman praktikal daripada artikel ini. Mari mulakan!

Isi soalan

Saya baru mengenali golang dan cuba memahami konkurensi dalam bahasa. Saya mempunyai kod yang menolak beberapa nilai ke saluran dan kemudian membacanya.

package main

import (
    "log"
    "time"
)

func Greet2(c chan string) {
    // logging to Stdout is not an atomic operation
    // so artificially, sleep for some time
    time.Sleep(2 * time.Second)
    
    // 5. until below line reads and unblock the channel
    log.Printf("5. Read Greet2:: %s\n\n", <-c)
}

func Greet(c chan string) {
    // 4. Push a new value to the channel, this will block
    // Process will look for other go routines to execute
    log.Printf("4. Add 'Greet::John' to the channel, block until it is read. Remember, 'Greet' goroutine will block and only other goroutines can run even though this go routine can pull the value out from the channel.\n\n")
    c <- "Greet::John!"
    
    // 8. This statement will never execute
    log.Printf("8. Read Greet:: %s !\n\n", <-c)
}

func main() {

    c := make(chan string)

    log.Println("1. Main start")
    
    // 2. Both go routine will be declared and both will
    // for a value to be inserted in the channel
    log.Println("2. Declare go routines.\n\n")
    go Greet(c)
    go Greet2(c)
    
    // 3. write will block
    log.Println("3. Add 'main::Hello' to the channel, block until it is read. Remember, 'main' goroutine will block and only other goroutines can run even though this go routine can pull the value out from the channel.\n\n")
    c <- "main::Hello"
    
    // Sleep to give time goroutines to execute
    time.Sleep(time.Second)
    
    // 6. read the channel value.
    log.Printf("6. Read main:: %s \n\n", <-c)
    
    // 7. Insert a new value to the channel
    log.Println("7. Add 'main::Bye' to the channel, block until it is read.\n")
    c <- "main::Bye"
    
    // Sleep to give time goroutines to execute
    time.Sleep(time.Second)
    log.Println("9. Main stop")

}
Salin selepas log masuk

Keluaran program di atas ialah

2023/09/02 21:58:07 1. Main start
2023/09/02 21:58:07 2. Declare go routines.


2023/09/02 21:58:07 3. Add 'main::Hello' to the channel, block until it is read. Remember, 'main' goroutine will block and only other goroutines can run even though this go routine can pull the value out from the channel.


2023/09/02 21:58:07 4. Add 'Greet::John' to the channel, block until it is read. Remember, 'Greet' goroutine will block and only other goroutines can run even though this go routine can pull the value out from the channel.

2023/09/02 21:58:10 5. Read Greet2:: main::Hello

2023/09/02 21:58:11 6. Read main:: Greet::John!

2023/09/02 21:58:11 7. Add 'main::Bye' to the channel, block until it is read.

2023/09/02 21:58:11 8. Read Greet:: main::Bye !

2023/09/02 21:58:12 9. Main stop
Salin selepas log masuk

Saya tidak faham kenapa 4.(另一个写入通道)在 5.(第一次从通道读取)之前执行,因为 3. 将阻塞,并且在读取值之前通道不可用来自它(在步骤 5. 中)。我是否误解了阻塞行为,在步骤 3. 中,只有 main goroutine 块和 Greet (在步骤 4. ) boleh menulis nilai tambahan pada saluran? Penjelasan benar-benar akan menjelaskan kekeliruan saya :)

Sekian, D.D.

<小时/>

Terima kasih atas balasan anda, saya telah mencipta program yang lebih mudah untuk ditunjukkan. Concurrency

package main

import (
        "fmt"
)

func do2(c chan int) {
        fmt.Println(<-c)
}

func do(c chan int) {
        // 4. this statement is trying to write another value "2" to the channel
        // Channel already contains "1" as the value which has not been read yet.
        // this statement will wait for "1" to get read and block the execution.
        // Scheduler will look for other goroutines that can execute.
        // However, this("do") is blocked as well as "main" is blocked too and
        // there are no other goroutines to execute.
        // Hence, will result in a "Deadlock" fatal error.
        c <- 2
        fmt.Println(<-c)
}

func main() {

        // 1. Declare a channel
        c := make(chan int)
        // 2. Declare "do" goroutine
        go do(c)
        // 3. write "1" to the channel
        // This will block and wait for program's other goroutines to read the value.
        // however, there is only "do" goroutine is defined can run at this point.
        // Scheduler, will try to run "do" goroutine.
        c <- 1
        go do2(c)

}
Salin selepas log masuk

Kebuntuan boleh dibetulkan dengan menukar penyataan c <- 1 dan go do2(c). 死锁可以通过交换c <- 1go do2(c)语句来修复。

解决方法

在 Go 中,当您在通道上发送值时(步骤 3 中的 c <- "main::Hello"),发送 Goroutine 将阻塞,直到有另一个 Goroutine 准备好从通道接收值。然而,这并不意味着没有其他 goroutine 可以继续执行。在您的代码中, GreetGreet2

Penyelesaian

Dalam Go, apabila anda menghantar nilai pada saluran (c <- "utama::Hello" dalam langkah 3), penghantaran Goroutine akan menyekat sehingga terdapat A Goroutine yang lain bersedia untuk menerima nilai daripada saluran. Walau bagaimanapun, ini tidak bermakna tiada gorout lain boleh terus dilaksanakan. Dalam kod anda,
    coroutine semuanya menunggu nilai daripada saluran, jadi apabila anda menghantar nilai dalam langkah 3, salah satu daripada mereka (tiada jaminan yang mana satu) akan menyahsekat dan meneruskan pelaksanaan.
  1. cIzinkan saya memecahkan urutan peristiwa langkah demi langkah:
  2. GreetGreet2Program utama bermula dan anda mencipta saluran
  3. .
  4. GreetGreet2Anda mengisytiharkan dua gorouti,
  5. , dan kedua-duanya sedang menunggu nilai daripada saluran.
  6. Greet 解除阻塞并继续执行。它记录消息“4. 将‘Greet::John’添加到频道...”并发送“Greet::John!”在频道上。这会再次阻塞 GreetAnda menghantar nilai "utama::Hello" pada saluran, yang menyekat goroutine utama sehingga goroutin lain membaca data daripada saluran. Walau bagaimanapun, salah satu daripada dua Goroutine (
  7. ) tidak akan disekat daripada menerima nilai.
  8. Greet2
  9. , kerana tiada goroutine lain boleh membaca dari saluran pada masa ini.
  10. Nyahsekat dan teruskan pelaksanaan. Ia log mesej "5. Baca Greet2::main::Hello" dan membaca nilai "utama::Hello" daripada saluran. Greet 在向通道写入时仍被阻止,而 Greet2
  11. Utama dibuka, merekodkan "6. Baca utama::Sambut::John!"
  12. GreetMain menghantar nilai lain "utama::Bye" pada saluran. Pada ketika ini,
  13. masih disekat semasa menulis ke saluran, dan
  14. disekat daripada tidak membaca daripada saluran.
Memandangkan

masih disekat pada penulisan, ia tidak pernah mencatatkan "8. Baca Salam:: utama::Selamat tinggal Greet2 碰巧首先被解锁,但也可能是 Greet

Tapak utama.

🎜Jadi kunci untuk memahami gelagat di sini ialah apabila anda menghantar nilai pada saluran, ia membuka kunci mana-mana goroutine yang sedang menunggu untuk membaca data daripada saluran tersebut. Susunan goroutin menunggu dinyahsekat tidak ditentukan dan bergantung pada penjadual. Dalam kes anda, 🎜 kebetulan dibuka kuncinya dahulu, tetapi mungkin juga 🎜. 🎜 🎜Ringkasnya, gelagat yang anda perhatikan adalah konsisten sepenuhnya dengan cara saluran Go berfungsi, dengan kaveat bahawa perintah pelaksanaan antara Goroutines yang bersaing tidak dijamin. 🎜

Atas ialah kandungan terperinci Memahami tingkah laku saluran menyekat golang dengan menulis beberapa kali ke saluran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cabaran keselamatan dalam pembangunan Golang: Bagaimana untuk mengelak daripada dieksploitasi untuk penciptaan virus? Cabaran keselamatan dalam pembangunan Golang: Bagaimana untuk mengelak daripada dieksploitasi untuk penciptaan virus? Mar 19, 2024 pm 12:39 PM

Cabaran keselamatan dalam pembangunan Golang: Bagaimana untuk mengelak daripada dieksploitasi untuk penciptaan virus? Dengan aplikasi Golang yang luas dalam bidang pengaturcaraan, semakin ramai pembangun memilih untuk menggunakan Golang untuk membangunkan pelbagai jenis aplikasi. Walau bagaimanapun, seperti bahasa pengaturcaraan lain, terdapat cabaran keselamatan dalam pembangunan Golang. Khususnya, kuasa dan fleksibiliti Golang juga menjadikannya alat penciptaan virus yang berpotensi. Artikel ini akan membincangkan isu keselamatan dalam pembangunan Golang dan menyediakan beberapa kaedah untuk mengelakkan G

Bangunkan aplikasi desktop yang berkuasa dengan Golang Bangunkan aplikasi desktop yang berkuasa dengan Golang Mar 19, 2024 pm 05:45 PM

Gunakan Golang untuk membangunkan aplikasi desktop yang berkuasa Dengan pembangunan Internet yang berterusan, orang ramai menjadi tidak dapat dipisahkan daripada pelbagai jenis aplikasi desktop. Bagi pembangun, adalah penting untuk menggunakan bahasa pengaturcaraan yang cekap untuk membangunkan aplikasi desktop yang berkuasa. Artikel ini akan memperkenalkan cara menggunakan Golang (bahasa Go) untuk membangunkan aplikasi desktop yang berkuasa dan menyediakan beberapa contoh kod khusus. Golang ialah bahasa pengaturcaraan sumber terbuka yang dibangunkan oleh Google Ia mempunyai ciri-ciri kesederhanaan, kecekapan, konkurensi yang kuat, dsb., dan sangat sesuai untuk

Langkah dan petua untuk pengaturcaraan dengan Golang pada Mac Langkah dan petua untuk pengaturcaraan dengan Golang pada Mac Mar 03, 2024 am 08:30 AM

Tajuk: Langkah dan teknik untuk menggunakan pengaturcaraan Golang pada Mac Dalam bidang pembangunan perisian semasa, Golang (juga dikenali sebagai Go), sebagai bahasa pengaturcaraan yang cekap, ringkas dan sangat bersesuaian, telah menarik perhatian lebih ramai pembangun . Apabila memprogramkan Golang pada platform Mac, anda boleh menggunakan beberapa alat dan teknik untuk meningkatkan kecekapan pembangunan. Artikel ini akan memperkenalkan langkah dan teknik menggunakan pengaturcaraan Golang pada Mac dan menyediakan contoh kod khusus untuk membantu pembaca memahami dan menggunakan dengan lebih baik. Langkah 1: Pasang Gol

Apakah bahasa pengaturcaraan yang biasa digunakan oleh pembangun Golang? Apakah bahasa pengaturcaraan yang biasa digunakan oleh pembangun Golang? Mar 18, 2024 pm 09:06 PM

Golang ialah bahasa pengaturcaraan sumber terbuka yang dibangunkan oleh Google dan digunakan secara meluas dalam pembangunan perkhidmatan bahagian belakang, pengkomputeran awan, pengaturcaraan rangkaian dan bidang lain. Sebagai bahasa yang ditaip secara statik, Golang mempunyai model konkurensi yang cekap dan perpustakaan standard yang berkuasa, jadi ia digemari oleh pembangun. Walau bagaimanapun, dalam pembangunan sebenar, pemaju Golang biasanya perlu menggabungkan bahasa pengaturcaraan lain untuk pembangunan projek untuk memenuhi keperluan senario yang berbeza. PythonPython ialah bahasa pengaturcaraan berorientasikan objek yang ringkas, jelas dan mudah dipelajari.

Rangka kerja kit Go membantu meningkatkan prestasi API Golang Rangka kerja kit Go membantu meningkatkan prestasi API Golang May 07, 2024 pm 03:24 PM

Gokit ialah rangka kerja mikro perkhidmatan Golang yang meningkatkan prestasi API melalui ciri yang dioptimumkan, berskala, boleh diselenggara dan mesra ujian. Ia menyediakan pelbagai alat dan corak yang membolehkan pengguna membina API yang berprestasi dan boleh diselenggara dengan cepat. Dalam pengeluaran sebenar, ia digunakan secara meluas dalam pembinaan API platform besar seperti Netflix, Spotify dan Uber, mengendalikan permintaan besar-besaran.

Penyelidikan tentang kesan dan peranan Golang terhadap pembangunan rantaian blok Penyelidikan tentang kesan dan peranan Golang terhadap pembangunan rantaian blok Feb 26, 2024 pm 04:24 PM

Golang (pendek kata bahasa Go) sebagai bahasa pengaturcaraan telah muncul secara beransur-ansur dalam bidang blockchain sejak beberapa tahun kebelakangan ini, keupayaan pemprosesan serentak yang cekap dan ciri sintaks yang ringkas menjadikannya pilihan yang digemari dalam pembangunan blok. Artikel ini akan meneroka bagaimana Golang membantu pembangunan blockchain dan menunjukkan keunggulannya dalam aplikasi blockchain melalui contoh kod tertentu. 1. Kelebihan Golang dalam bidang blockchain: Keupayaan pemprosesan serentak yang cekap: Nod dalam sistem blockchain perlu memproses sejumlah besar transaksi dan data pada masa yang sama, dan Gola

Kelebihan dan Kelemahan Menggunakan Golang untuk Membangunkan Permainan Mudah Alih Kelebihan dan Kelemahan Menggunakan Golang untuk Membangunkan Permainan Mudah Alih Mar 05, 2024 pm 03:51 PM

Kelebihan dan Kelemahan Menggunakan Golang untuk Membangunkan Permainan Mudah Alih Dengan populariti peranti mudah alih dan peningkatan berterusan prestasi mereka, pasaran permainan mudah alih menjadi semakin popular, menarik lebih ramai pembangun untuk menyertainya. Apabila memilih bahasa pembangunan, Golang, sebagai bahasa yang pantas, cekap dan mudah dipelajari, menarik perhatian ramai pembangun. Artikel ini akan membincangkan kelebihan dan kekurangan menggunakan Golang untuk membangunkan permainan mudah alih, dan menggambarkannya melalui contoh kod khusus. Kelebihan: Cross-platform yang kuat: Golang boleh disusun menjadi binari untuk platform yang berbeza

Analisis kemungkinan menggunakan Golang untuk membangunkan projek U3D Analisis kemungkinan menggunakan Golang untuk membangunkan projek U3D Mar 20, 2024 pm 02:30 PM

Tajuk: Analisis Kebolehlaksanaan Menggunakan Golang untuk Membangunkan Projek U3D Dengan pembangunan berterusan industri pembangunan permainan, Unity3D (pendek kata U3D), sebagai enjin permainan yang digunakan secara meluas, menyediakan alat dan sokongan yang berkuasa kepada pembangun. Dalam aplikasi sebenar, pembangun juga berminat untuk menggunakan bahasa pengaturcaraan lain untuk membangunkan projek U3D. Artikel ini akan menganalisis kebolehlaksanaan menggunakan Golang untuk membangunkan projek U3D dan menyediakan beberapa contoh kod khusus. 1. Gabungan Golang dan U3D Go

See all articles