php editor Baicao is here to answer a common question: "When using channels, what is the execution order of goroutines?" In the Go language, goroutines are lightweight Threads can be executed concurrently. When using channels for communication between coroutines, the channel's receive and send operations are blocking, that is, they wait for the operations of other coroutines to complete. Therefore, when multiple goroutines operate a channel at the same time, their execution order is uncertain and depends on the scheduling of each coroutine. This means that it is impossible to determine which goroutine will be executed first and which will be executed later. This is determined by the scheduler of the Go language.
Question content
What is the execution order of goroutines when using channels? I think writing or reading the channel stops the current goroutine. But my test code doesn't follow this rule:
func main() { ch := make(chan int) go sum(ch, 3) fmt.Println("Write number: 10") ch <- 10 fmt.Println("Write number: 20") ch <- 20 fmt.Println("Write number: 30") ch <- 30 fmt.Println("Finish main") } func sum(ch chan int, len int) { fmt.Println("Func 'sum' start") sum := 0 for i := 0; i < len; i++ { fmt.Println("For start") num := <-ch fmt.Printf("Read from ch: %d\n", num) sum += num fmt.Println("For finish") } fmt.Printf("Sum: %d\n", sum) }
How I think this program works:
1.Create channel
2. Create a goroutine (not started, only initialized)
3. Print: write down the number: 10
4. Record to channel 10. Lock key functions.
5. The most important thing is to be blocked. Start sum goroutine.
6. Print summation function: Func 'sum' start
7. The summation function runs in a loop and prints: "To begin"
8. Read the number 10 from "ch" and print: "Read from ch: 10"
9.Next step. Print: "Done" and continue with the next iteration.
10. Print: "starts with" and try writing "with". But the channel is empty. Stop the quota and enter the main line
...again and again.
Then I want to see:
Write number: 10 Func 'sum' start For start Read from ch: 10 For finish For start Write number: 20 Read from ch: 20 For finish For start Write number: 30 Read from ch: 30 For finish Sum: 60 Finish main
But, I saw:
Write number: 10 Func 'sum' start For start Read from ch: 10 For finish For start Write number: 20 Write number: 30 Read from ch: 20 For finish For start Read from ch: 30 For finish Sum: 60 Finish main
How can this be? The main function writes to the channel twice without reading.
Also, if you change the number of calls in for:
go sum(ch, 2)
I don't get the error. But no one read the last message
Example: before this message.
Solution
Goroutines run concurrently. On systems with multiple cores, they can run in parallel. The details depend on the scheduler implementation in the Go runtime. For all intents and purposes, with the exception of synchronous operations like channel communication, things happen in random order.
This is not the case and is not what is happening (as long as the channel is not buffered). The Println call occurs before the send operation, and the main Goroutine blocks after printing until the sum Goroutine is ready to receive.
Whether you see "Read from ch: 30" printed is also random. The corresponding receive operation must occur because main blocks until it does. However, main may return before Println after the receive has occurred, and the program will terminate immediately when main returns, regardless of the presence of any other goroutines. If the channel is buffered, the likelihood of this happening increases.
But in fact, it's not. If there are only two receivers it will always lead to a deadlock: https://go.dev/play/p/ qFVh529mkqR
The above is the detailed content of When using channels, what is the order of execution of goroutines?. For more information, please follow other related articles on the PHP Chinese website!

go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofmt使用tab进行缩进);gofmt工具会以标准样式的缩进和垂直对齐方式对源代码进行格式化,甚至必要情况下注释也会重新格式化。

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。

是,TiDB采用go语言编写。TiDB是一个分布式NewSQL数据库;它支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具有数据强一致的高可用特性。TiDB架构中的PD储存了集群的元信息,如key在哪个TiKV节点;PD还负责集群的负载均衡以及数据分片等。PD通过内嵌etcd来支持数据分布和容错;PD采用go语言编写。

go语言能编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言。对Go语言程序进行编译的命令有两种:1、“go build”命令,可以将Go语言程序代码编译成二进制的可执行文件,但该二进制文件需要手动运行;2、“go run”命令,会在编译后直接运行Go语言程序,编译过程中会产生一个临时文件,但不会生成可执行文件。

go语言需要编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言,也就说Go语言程序在运行之前需要通过编译器生成二进制机器码(二进制的可执行文件),随后二进制文件才能在目标机器上运行。

删除字符串的方法:1、用TrimSpace()来去除字符串空格;2、用Trim()、TrimLeft()、TrimRight()、TrimPrefix()或TrimSuffix()来去除字符串中全部、左边或右边指定字符串;3、用TrimFunc()、TrimLeftFunc()或TrimRightFunc()来去除全部、左边或右边指定规则字符串。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 Mac version
God-level code editing software (SublimeText3)

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Notepad++7.3.1
Easy-to-use and free code editor

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.
