并发:电脑同时听歌,看电影,写代码等。cpu根据时间片进行划分,交替执行三个程序
并行:多个cpu(核)同时执行
C语言实现并发过程使用的是多线程(C++的最小资源单元),进程
Go语言里面不是线程,而是go程 --> goroutine, go程是go语言原生支持的
每一个go程占用的系统资源远远小于线程,一个go程大约需要4k-5k的内存资源
一个程序可以启动大量的go程
线程 --> 几十个 , go程可以启动成百上千个, 对于实现高并发的性能非常好
只需要在目标函数前加上go关键字即可使用
方向只能从右往左 : <-
有缓冲区通道(channel)读写要一致,否则就会堵塞
当管道的读写次数不一致的时候
如果阻塞在主go程,那么程序会崩溃
如果阻塞在子go程,那么会出现内存泄漏
使用管道时,用此方法使管道比较可控
管道总结当管道写满了,写阻塞
当缓冲区读完了,读阻塞
如果管道没有使用make分配空间,默认是nil
从nil的管道读取数据、写入数据,都会堵塞(不会崩溃)
从一个已经close的管道读取数据时,会返回零值(不会崩溃)
向一个已经close的管道写数据时,会崩溃
关闭一个已经关闭的管道,程序会崩溃
关闭管道的工作,要放在写入端,不能放在读取端
读和写的次数一定要对等,否则
在多个go程中,资源泄露
在主go程中,程序崩溃(deadlock)
需要指定一个管道的状态,如果已经关闭了,读不怕会返回零,如果再写入的话,有崩溃的风险
单向通道numChan :=make(chan int, 10) --> 双向通道,既可以读,也可以写
单向通道:为了明确语义,一般用于函数参数
单向读通道
单向写通道
当程序中有多个channel协同工作,chan1,chan2,某一时刻,chan1或chan2出发,程序要做响应的处理,使用select来监听多个通道,当管道被触发时(写入,读取,关闭)
select语法与switch case 很想,但是所有的分支条件都必须是通道的io