「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」。
0 环境
- 系统环境:win10
- 编辑器:vscode
- go版本:gol.17.3
- 参考文章:go语言中文文档
1 初识并发
1 进程和线程
打开一个程序,操作系统为其分配相应资源(创建进程).进程启动一个主线程,他管着下面一帮线程小弟。
2 并发并行
多核运行 --> 并行,单核运行 --> 并发。
3 协程
协程又被称为
goroutine。协程不仅轻量,而且一个程序可以启动上千+个协程。go并发是go自己决定,比如执行数量和指定运行哪几个。
2 初拥协程
go启动一个
goroutine的写法:go function(),也就是go 调用方法/函数。
如下:1和2是并发的,时间延时,为了让1等一会2,不然1先结束退出了,就看不到2的打印结果了。
3 Channel
当启动了多个协程时,怎么管理它们之间的连接呢?Channel解决了这个问题。
1 创建Channel
声明一个
Channel,make(chan string),chan我把它看作Channel的简拼,chan是一个集合类型。
接收:<- chan,获取chan值,有点像java中的get,这样不容易记住,我们把<-当作天线,把chan当做黑白电视,连起来就是接收信号给黑白电视。
发送:chan <-,向chan发送值,有点像java中的set,这里我们把<-当作火炮,把chan当做那只可怜的猫,火炮上绑着个一只可怜的猫,发送到了墙上(脑补猫和老鼠里的画面)。
开启一个goroutine,向goroutine中chan的类型发送变量,从我们上面的角度来看,应该只输出1才对呢,毕竟没有延时嘛,这里多了发送接收,应该就是它们在搞事情了,一个有值在发送,一个等待(延时)这里的c变量有值。有点队列的味道。
4 总结
并发就是把一个人用到极致,并行是一伙人一起并行走。这里的协程就像里面的机器,这个很大很大的车间里可以有很多台机器。启动单个
goroutine需要加个延时,多个协程通信需要创建Channel,值的发送接收,<-在chan前,是接收,<-在chan后,就是发送,收发有点队列的即视感。