把等待与工作分开
服务器可能同时等待网络输入、处理已有请求并写入结果。这些活动不必每一步都按一条固定顺序完成,因此可以分成独立推进的任务。并发关注这种组织关系:一个任务等待外部结果时,系统仍能安排其他任务工作,而不是要求整个程序一直停在同一处。
参考:[1]
并发与并行的区别
并行强调多个计算在同一时间实际执行,并发强调程序怎样组织多个活动。单处理器可以通过交错调度支持并发;多处理器则可能让其中一些活动并行。把程序拆成更多任务并不保证速度成比例增加,任务还可能等待同一资源,或花费大量时间通信与协调。
参考:[1]
共享数据为什么需要同步
两个活动访问同一位置,且至少一个在写入时,程序需要规定它们的协调方式。锁、通道和原子操作能够建立某些先后关系,不能仅凭“代码先写在文件前面”断定另一任务已经看到结果。Go内存模型明确区分数据竞争与有同步保证的执行,为这种推理提供共同依据。
参考:[2]
先安排依赖再增加任务
合理的并发设计要说明谁产生数据、谁消费数据、何时可以结束,以及失败怎样传递。任务之间相互等待会形成死锁,无限制地产生任务也可能耗尽资源。先识别真正独立的活动,再给通信和共享状态明确边界,才能让并发结构与实际工作量相匹配。