并发不是并行,它更好!
作者:网络转载 发布时间:[ 2014/7/23 13:44:47 ] 推荐标签:并发 并行 性能测试
现代社会是并行的:多核、网络、云计算、用户负载,并发技术对此有用。
Go语言支持并发,它提供了:并发执行(goroutines),同步和消息(channels)和多路并发控制(select)。
当Go声称是并发时,人们说:“并发很酷!耶,我可以并行运行了!”,但这是个错误的。因为很多人都不了解他们间的差别。“我用四个处理器来做质数筛选,但是更慢了。”
并发(Concurrency):以可独立执行的进程集合的方式编程(进程是出了名的难定义,这里是通常意义上的进程,不是Linux进程)
并行(Parallelism):以可同时执行的(可能相关的)计算指令方式编程。
两者的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。不同,但也相关。一个是关于代码结构,一个是关于代码执行。并发为可能的(不是必须的)并行问题提供了一种解决方案。
一个类比:
鼠标、键盘、显示器、磁盘驱动是并发结构的。
向量点积是并行的。
并发带有通信:
并发是一种构造程序的方式,把任务分解为一个个独立运行的小任务。通信是协调这些小任务的手段。
Go的模型(还有Erlang等)都是基于CPS(Communicating sequential processes, 通信顺序进程):其论文C. A. R. Hoare: Communicating Sequential Processes (CACM 1978)
以上讲得太抽象了,我们举实际点的例子。
我们的问题:把一堆废弃语言的说明书运到火炉里,一只地鼠会花费很长时间。
更多的地鼠
单单更多的地鼠也不解决问题,它们需要更多的推车。
更多的地鼠、更多的推车
这样会加快速度,但它们会在那堆书和炉子那边遇上瓶颈。同时也要同步两只地鼠,可以通过消息的方式实现。
全部加倍
这样会以两倍的速度运送。这是两个地鼠程序的并发构成(concurrent composition)。
但这种设计不是自发并行的,如果一次只有一只地鼠在运会怎样?
这种设计仍是并发,不是并行。[译者注:一只地鼠运一次上面那堆书,然后第二只地鼠再运一次下面那堆书。一次只允许一只地鼠运送,这样不是并行的。]
然而,这种场景是可以自发并行的。并发构成可以考虑下其他模型。
另一种设计
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11