为了账号安全,请及时绑定邮箱和手机立即绑定

简单的 Go 并发示例

简单的 Go 并发示例

Go
函数式编程 2022-01-10 17:50:31
使用并发来提高执行速度的简单示例是什么?我发现了许多使用并行的示例,但没有一个只使用并发。
查看完整描述

1 回答

?
一只萌萌小番薯

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 运行时的任务。


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


因此,您无法真正获得这样的示例,因为即使您可以获得“非常并发”的代码,执行速度也受限于两件事:

  1. 你可以并行多少

  2. go runtime 将如何调度 goroutines。


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信