基础
  • 并发:电脑同时听歌,看电影,写代码等。cpu根据时间片进行划分,交替执行三个程序

  • 并行:多个cpu(核)同时执行

  • C语言实现并发过程使用的是多线程(C++的最小资源单元),进程

  • Go语言里面不是线程,而是go程 --> goroutine, go程是go语言原生支持的

    • 每一个go程占用的系统资源远远小于线程,一个go程大约需要4k-5k的内存资源

    • 一个程序可以启动大量的go程

    • 线程 --> 几十个   , go程可以启动成百上千个, 对于实现高并发的性能非常好

  • 只需要在目标函数前加上go关键字即可使用

方向只能从右往左 : <-

有缓冲区通道(channel)

读写要一致,否则就会堵塞

  • 当管道的读写次数不一致的时候

    • 如果阻塞在主go程,那么程序会崩溃

    • 如果阻塞在子go程,那么会出现内存泄漏

    for_range读取管道

使用管道时,用此方法使管道比较可控

管道总结
  1. 当管道写满了,写阻塞

  2. 当缓冲区读完了,读阻塞

  3. 如果管道没有使用make分配空间,默认是nil

  4. 从nil的管道读取数据、写入数据,都会堵塞(不会崩溃)

  5. 从一个已经close的管道读取数据时,会返回零值(不会崩溃)

  6. 向一个已经close的管道写数据时,会崩溃

  7. 关闭一个已经关闭的管道,程序会崩溃 

  8. 关闭管道的工作,要放在写入端,不能放在读取端

  9. 读和写的次数一定要对等,否则

    1. 在多个go程中,资源泄露

    2. 在主go程中,程序崩溃(deadlock)

判断管道是否已经关闭

需要指定一个管道的状态,如果已经关闭了,读不怕会返回零,如果再写入的话,有崩溃的风险

单向通道

numChan :=make(chan int, 10) --> 双向通道,既可以读,也可以写

单向通道:为了明确语义,一般用于函数参数

  • 单向读通道

  • 单向写通道

select

当程序中有多个channel协同工作,chan1,chan2,某一时刻,chan1或chan2出发,程序要做响应的处理,使用select来监听多个通道,当管道被触发时(写入,读取,关闭)

select语法与switch case 很想,但是所有的分支条件都必须是通道的io