go语言Goroutines笔记

118 阅读1分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」。

0 环境

1 初识并发

1 进程和线程

打开一个程序,操作系统为其分配相应资源(创建进程).进程启动一个主线程,他管着下面一帮线程小弟。

2 并发并行

多核运行 --> 并行,单核运行 --> 并发。

3 协程

协程又被称为goroutine。协程不仅轻量,而且一个程序可以启动上千+个协程。go并发是go自己决定,比如执行数量和指定运行哪几个。

2 初拥协程

go启动一个goroutine的写法:go function(),也就是go 调用方法/函数

如下:1和2是并发的,时间延时,为了让1等一会2,不然1先结束退出了,就看不到2的打印结果了。

image.png

image.png

3 Channel

当启动了多个协程时,怎么管理它们之间的连接呢?Channel解决了这个问题。

1 创建Channel

声明一个Channelmake(chan string),chan我把它看作Channel的简拼,chan是一个集合类型。

接收:<- chan,获取chan值,有点像java中的get,这样不容易记住,我们把<-当作天线,把chan当做黑白电视,连起来就是接收信号给黑白电视。

发送:chan <-,向chan发送值,有点像java中的set,这里我们把<-当作火炮,把chan当做那只可怜的猫,火炮上绑着个一只可怜的猫,发送到了墙上(脑补猫和老鼠里的画面)。

开启一个goroutine,向goroutinechan的类型发送变量,从我们上面的角度来看,应该只输出1才对呢,毕竟没有延时嘛,这里多了发送接收,应该就是它们在搞事情了,一个有值在发送,一个等待(延时)这里的c变量有值。有点队列的味道。

image.png

4 总结

并发就是把一个人用到极致,并行是一伙人一起并行走。这里的协程就像里面的机器,这个很大很大的车间里可以有很多台机器。启动单个goroutine需要加个延时,多个协程通信需要创建Channel,值的发送接收,<-chan前,是接收,<-chan后,就是发送,收发有点队列的即视感。