并发和通道
#网络开发人员 #api #go #并发性

介绍

并发基本上可以通过改善响应时间和改善资源利用来使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出版物