天天看点

Go并发之CSP并发模型、协程并发

csp 即通信顺序进程、交谈循序程序,又被译为交换消息的循序程序(communicating sequential processes),它是一种用来描述并发性系统之间进行交互的模型。

csp模型的最大优点是灵活。但是容易出现死锁的情况,且未给予直接的并行支持,并行需要建立在并发的基础之上。

在csp模型里面,进程间需要经过一种被称为管道来进行通信。

什么是管道,两个并发任务不需要共享内存,而是通过建立一条点对点的管道,数据用完之后,管道立即撤销。有了管道,不需要事先锁,而是需要用数据时建立管道。不需要数据时就撤销管道了。

管道与共享内存之间有很大的区别,内存共享是通过内存来共享内存,而管道是通过通信来共享内存。所以管道通信比内存共享效率要高很多。

coroutine就是协程,也称为go程。通过管道能够实现百万级的并发。如果说线程是抢占式的,那么协程是协作式的。在协程里面,也是通过管道来调度的。解放线程对cpu和内存的开销,线程是先占用cpu和内存后才调度,而协程是通过通信发送信号来调度,协程全是通过管道,由于协程的消耗比线程小很多,所以能够实现百万并发。

在协程中,io操作时绝大部分时间与cpu无关,这是管道带来的优势,不需要长时间锁住内存,也不需要cpu来做调度。

8g内存的电脑,用java,c来做并发,差不多也就千级并发,而用go语言,通过管道可以让并发能力得到很大提升。