介绍
并发基本上可以通过改善响应时间和改善资源利用来使GO程序更快地运行。 Goroutines和频道是GO中使用的编程结构,goroutines很便宜,轻巧的线程,而频道让Goroutines互相交谈。
在编写循环代码时,您告诉计算机一次又一次地执行几行代码,而在编写并发代码时,您告诉您 您的计算机 带他的朋友, 另一台计算机 ,在您的计算机继续执行工作时执行其他代码。 Goroutine是其他计算机,除了它不是计算机,而且还可以猜猜它也不是线程。这里要注意的另一件事是,另一台计算机是独立于您的计算机运行的。如果他们想互相交谈,他们将不得不在GO中使用所谓的频道。现在让我们看到Goroutine和Channel
的细微差别goroutines
单词“ go”一词需要附加到任何指定或匿名函数上,并且该函数变为goroutine。下面的简单演示
func printhi() { fmt.Println("hi")}
func main() {
// named function
go printhi()
// Anonymous function
go printHello() { fmt.Prinln("Hello")}()
}
这里 printhi 和 printhello 应该同时运行,而主函数也在运行。如果执行执行,则在Stdout上没有打印HI和Hello的可能性很大,因为该程序仅在主函数运行之前运行。
Goroutines的功能
- 与线程相比,它们轻巧且便宜
- 可以将数千个独立的goroutines多路复用到一个线程
- 命名或匿名函数可以作为goroutines 运行
- 如果一个线程被阻止,则该线程上的另一个goroutines将通过GO运行时移动到另一个未封闭的线程中。
渠道
可以将通道可视化为 box ,现在,如果它是一个未封闭的通道,则只能容纳单个项目,这意味着如果 a a goroutine在盒子里放1个, Goroutine b 在将现有的1取出后,无法将其放入其中,这会导致阻塞。另一方面,未封闭的通道可以容纳物品,直到已满,以封锁未封闭的通道。
习惯阻止机制对初学者来说是一个棘手的棘手,从更简单的角度来看,程序睡觉并等待一些东西唤醒。 /p>
让我们看看在哪些情况下发生阻塞,我们将服用2个goroutines(发送和接收)和1个频道(CH)
- ch 在其中包含1个,并发送要将2放在CH中,它将导致块
- ch 是空的,并从CH接收值的值,它将导致块
新秀错误就是只需从主计划中从频道发送和接收数据即可。发生的事情是其中之一是导致阻塞的,并且由于除了主要功能以外,我们没有其他Goroutine,因此没有任何阻止主程序本身,因此 *僵局 *发生。
让我们知道,查看创建频道和发送的代码,从中接收值
// channel is created using "make"
// this here is a unbuffered integer channel
// int can be replaced by bool, string or anything that the user wants.
ch := make(chan int)
// this here is a buffered integer channel of size 2
ch := make(chan int , 2 )
// this is how you can insert a value inside a channel
ch <- 1
// this is how you can take values out of a channel
number := <- ch
// The direction of arrow indicates the flow of data.
缓冲通道是固定尺寸的通道,可以添加项目,直到所有空间都被占据频道内,并且以相同的方式可以检索项目,直到整个通道为空,数据遵循第一个IN, ,首先时尚。
同意的概念是不是详尽无遗的,而且我想写的更多内容,恐怕我不想在同一篇文章中弄乱所有内容
参考
Sau Sheong Chang的网络编程,Manning出版物