Simple Go并发示例

时间:2016-05-21 18:33:53

标签: go concurrency

用于提高执行速度的并发的简单示例是什么? 我发现了许多使用并行性但没有使用并发性的例子。

1 个答案:

答案 0 :(得分:4)

并发和并行是两个相关但不同的东西。这个主题很广泛,但让我简单地关注速度。

并发性与如何设计和构建程序有关,如果可以应用并行性,那么软件可以运行得更快。

例如;如果你有一个循环,如

x := []int{1, 2, 3, 4, 5, 6}
for i := range x {
  x[i] *= x[i];
}

这个节目"感觉"并发,因为计算数组中每个数字的平方的读写指令在逻辑上彼此独立。因此,理论上您可以以并发方式设计代码,例如使用goroutines:

x := []int{1, 2, 3, 4, 5, 6}
for i := range x {
  go func(j int) { x[j] *= x[j]; }(i)
}
wait_the_goroutines();

现在假设此示例中没有数据争用,并且每个更新都可以独立完成。那么,这些值的更新可以并行进行,因为并发设计允许它。使用旧代码,更新是串行设计

当计算机(CPU,GPU等)能够在同一时间同时处理多个指令时,就会出现并行性。如果您的计算机中有一个核心,则上述goroutines不太可能并行执行。如果你有多个核心,他们可能并行执行 - 因为它们可以,但你没有实际的控制你的计算机并行硬件的使用方式并行执行代码。这是go运行时的任务。

从某种意义上说,并发不是用来提高执行速度的:并行性是。并发用于允许正确的代码并行化。

因此,你无法真正得到这样的例子,因为即使你能得到一个非常并发的"代码,执行速度受限于两件事:

  1. 您可以并行化多少
  2. go运行时将如何安排goroutines。