并发和并行
并发不是并行
golang被成为原生支持并发的语言,那么什么是并发? go语言之父Rob Pike就专门回答过这个问题,并且和做了一个 并发不是并行的演讲。
并发(Concurrency)将相互独立的执行过程综合到一起的编程技术。
并行(Parallelism)同时执行(通常是相关的)计算任务的编程技术。
上图是Erlang 之父 Joe Armstrong来解释并发和并行。并发是两队伍交替使用咖啡机,并行是两个队伍两个咖啡机。
并发是指同时处理很多事情,主要关注的是流程合理优化组合,这一点很像我们小时候学的《统筹时间》关于如何优化任务顺序然后更有效率。
而并行是指同时能完成很多事情。
两者不同,但相关。
一个注重点是组合,一个注重点是执行。
并发提供了一种方式让我们能够设计一种方案将问题并行的解决。
CSP并发模型
传统的并发模型(例如Java,C ++和Python程序时通常使用)要求程序员使用共享内存在线程之间进行通信。通常共享数据结构用锁保护,线程将争夺这些锁以访问数据。 golang虽然也支持这种并发模型,但是go更鼓励使用CSP(Communicating Sequential Processe,CSP)并发模型。CSP描述两个独立的并发实体(goroutine)通过共享的通讯 channel(管道)进行通信的并发模型。CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。
“Don’t communicate by sharing memory, share memory by communicating”——不要通过共享内存来通信,而应该通过通信来共享内存。