并发
并发简单讲,就是同时进行多事务处理。比如做一个即时通讯工具的视频聊天功能,对聊天双方用户来讲,每个用户侧,程序需要同时处理音频和视频,并展示出来。
并发机制,到目前来讲有三种方式。
进程----线程----协程
每后一个机制,都进一步优化了系统开销,即:
多进程的并发,消耗系统资源最多。
多线程的并发,消耗系统资源次多。
多协程的并发,消耗系统资源最少。
说明
最后的协程方式,就是go语言特有的,也是go号称的特点之一。使用很简单。
用关键字 go 在当前主程中开启协程。
package main
import (
"fmt"
)
func work1() {
for i := 0; i < 5; i++ {
fmt.Println("i am in work1")
}
}
func work2() {
for i := 0; i < 5; i++ {
fmt.Println("i am in work2")
}
}
func main() {
//开启work1协程
go work1()
//开启work2协程
go work2()
for i := 0; i < 5; i++ {
fmt.Println("i am in main")
}
首先要理解func main(){…}这部分,整体就是一个主程,也可以认为是程序的协程之一。
这样相当于我们执行了三个事务条线:
1、main
2、work1
3、work2
这三个事务主要做的工作在这里就是各自输出一段信息。另外一种理解方式是,这个程序首先默认执行main函数,在main函数里遇到go关键字,就以协程(并行)方式调用了work1函数,下面又遇到了go关键字,一样以协程(并行)方式调用了work2函数,然后继续往下执行后续的语句,在这个时刻之后,我们系统上就是三个函数所代表事务在同时运行。
看看运行后的结果:
并未按我们设想那样,看到work1和work2在工作。原因是main后续部分执行太快。
go编译器启动work1,work2还需要分配资源,进行调度。在这之前main执行完毕,程序结束,连带work1,work2两个协程也关闭了。
那这里,简单的处理下,在main里面设个停留时间,等等work1和work2。
package main
import (
"fmt"
"time"
)
func work1() {
for i := 0; i < 5; i++ {
fmt.Println("i am in work1")
}
}
func work2() {
for i := 0; i < 5; i++ {
fmt.Println("i am in work2")
}
}
func main() {
go work1()
go work2()
for i := 0; i < 5; i++ {
fmt.Println("i am in main")
}
time.Sleep(time.Second * 5)
}
引入一个time包,time.Sleep(time.Second * 5)意思是休息等待5秒,输出如下:
这就是go最简单的并发应用。
尾声
水煮鱼配方
原料:草鱼、辣椒酱、姜片、葱段。
做法步骤:
第1步、鱼片片、切块。
第2步、水煮鱼料包中的腌鱼料撒如,加入鸡蛋清腌制。
第3步、腌制一会儿。
第4步、爆香姜片下入水煮鱼的豆瓣酱料。
第5步、加入水,下入鱼头煮制入味。
第6步、鱼头炖制10分钟左右加入先下鱼骨,再过五分钟下鱼片。
第7步、捞出鱼加入豆腐煮。
第8步、豆腐铺底,加入鱼肉盛盆加入大蒜沫、香葱段。
第9步、放入麻椒辣椒,浇热油即可。
你。。。。。。。。。。。想吃不?