这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
通道:
3个操作:
1.发送(send) 2.接收(receive) 3.关闭(close)
1 和 2 属于通信 3 关闭发送数据回宕机
##无缓冲通道 此通道上发送操作会杜塞,再到另一个协程再洗执行接收操作,相反,无值时接收也会堵塞,知道有协程发送数据
管道
通道可以用来连接协程。一个输出是另一个的输入,叫管道。管道关闭后,任何后续发送的操作会导致应用程序崩溃。当已发送的数据被读完后,后续的接收可顺利进行,知识获取的值为0.
单向通道型
chan <- (可以只发生)< -- chan int(可以只接受)
缓冲_
发生:在对队尾插入。 接收 在列测头部移除。
select 多路复用
有时候不能从一个通道上接收,任一个在完成钱都堵塞、
关于协程
协程简单地理解为一种轻量级的线程。从操作系统的角度来看,线程是在内核态中调度的,而协程是在用户态调度的,所以相对于线程来说,协程切换的成本更低。协程虽然也有自己的栈,但是相比线程栈要小得多,典型的线程栈大小差不多有 1M,而协程栈的大小往往只有几 K 或者几十 K。所以,无论是从时间维度还是空间维度来看,协程都比线程轻量得多。
协程
相比线程而言,Go 协程的成本极低。堆栈大小只有若干 kb,并且可以根据应用的需求进行增减。而线程必须指定堆栈的大小,其堆栈是固定不变的。 Go 协程会复用(Multiplex)数量更少的 OS 线程。即使程序有数以千计的 Go 协程,也可能只有一个线程。如果该线程中的某一 Go 协程发生了阻塞(比如说等待用户输入),那么系统会再创建一个 OS 线程,并把其余 Go 协程都移动到这个新的 OS 线程。所有这一切都在运行时进行,作为程序员,我们没有直接面临这些复杂的细节,而是有一个简洁的 API 来处理并发。