go并发

1 管道

1.1 buffered channel

  • 有缓冲的管道是一种在被接收前能存储一个或者多个值得管道,这种类型的管道并不强制要求goroutine之前必须同时完成发送和接受。只有在通道中没有要接受的值时,接收动作才会阻塞。只有在通道没有可以用缓冲区容纳被发送的值时,发送动作才会阻塞(类似于linux下的信号量,P/V操作,如果信号量的值非0, P操作减1,否则阻塞等待信号量的值大于0)

  • 关闭通道之后,依然可以从通道接收数据,但是不能再向通道里发送数据。从一个已经关闭的并且没有数据的通道里获取数据,总是立刻返回,并且返回一个通道类型的零值。(类似于tcp对端断开连接,read返回0)