Golang中的Goroutine如何理解

免费建站   2024年03月29日 23:56  

Golang中的Goroutine如何理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

什么是Go协程

Go协程()是与其他函数同时运行的函数。可以认为Go协程是轻量级的线程,由Go运行时来管理。

在函数调用前加上go关键字,这次调用就会在一个新的goroutine中并发执行。当被调用的函数返回时,这个goroutine也自动结束。听着感觉像C# 中的Task。

需要注意的是,如果这个函数有返回值,那么这个返回值会被丢弃。

Go 协程(Goroutine)之间通过信道(channel)进行通信,简单的说就是多个协程之间通信的管道。信道可以防止多个协程访问共享内存时发生资源争抢的问题。

如何使用package mainimport ( "fmt" "time")func hello() { fmt.Println("Hello world goroutine")}func main() { go hello() time.Sleep(1 * time.Second) fmt.Println("main function")} Channel(管道)

Channel(管道) 可以被认为是协程之间通信的管道。与水流从管道的一端流向另一端一样,数据可以从信道的一端发送并在另一端接收。

1. 定义

每个channel都有一个类型。此类型是允许信道传输的数据类型。channel是类型相关的,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。

2. 声明

a. 我们需要通过内置函数make来创建一个信道。

下面的代码声明了一个信道:

varchchanint

b. 与其他变量定义一样,快速声明也是定义信道的一种有效而简洁的方式:

a:=make(chanint)

c.创建一个带缓冲的channel

c := make(chan int, 1024)// 从带缓冲的channel中读数据for i:=range c {  ...}

3. 发送和接收数据

通过信道发送和接收数据的语法如下:

data:=<-a//从channela读取数据a<-data//将数据写入到channela

箭头的指向说明了数据是发送还是接收,是不是特别简单?

完整例子

下面就直接说说,Goroutine和channel 共同使用的完整例子:

package mainimport ( "fmt" "time")func Producer(queue chan<- int) { for i := 0; i < 10; i++ { queue <- i //写入 fmt.Println("create :", i) }}func Consumer(queue <-chan int) { for i := 0; i < 10; i++ { v := <-queue // 读出 fmt.Println("receive:", v) }}func main() { queue := make(chan int, 88) go Producer(queue) go Consumer(queue) time.Sleep(1 * time.Second)} golang的优点

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部