1 回答
![?](http://img1.sycdn.imooc.com/54584cde0001d19202200220-100-100.jpg)
TA贡献1795条经验 获得超7个赞
并发和并行是两个相关但不同的东西。这个话题很广泛,但让我在这里简单地关注一下速度。
并发与如何设计和构建程序有关,如果可以应用并行性,那么软件可能运行得更快。
例如; 如果您有一个循环,例如
x := []int{1, 2, 3, 4, 5, 6}
for i := range x {
x[i] *= x[i];
}
这个程序“感觉”是并发的,因为计算数组中每个数字平方的读取和写入指令在逻辑上彼此独立。因此,理论上您可以以并发方式设计代码,例如使用 goroutine:
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 等)能够同时处理多条指令时,并行性就出现了。如果您的计算机中有一个内核,则上述 goroutine 不太可能并行执行。如果您有多个内核,它们可能会并行执行 - 因为它们可以并行执行,但是您无法实际控制计算机的并行硬件如何用于并行执行代码。这是 Go 运行时的任务。
从某种意义上说,并发并不是用来提高执行速度的:并行是。并发用于允许代码的正确并行化。
因此,您无法真正获得这样的示例,因为即使您可以获得“非常并发”的代码,执行速度也受限于两件事:
你可以并行多少
go runtime 将如何调度 goroutines。
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报