gpt4 book ai didi

concurrency - map() 和 reduce() 是否适合 Go 中的并发处理?

转载 作者:IT王子 更新时间:2023-10-29 01:37:17 26 4
gpt4 key购买 nike

我有 python 背景,刚开始接触 Go,我发现自己在寻找 Go 中 map() 和 reduce() 函数的等价物。我没有找到它们,所以又回到了 for 循环。例如,这是我用来代替 map() 的,其中 mapFunction 在别处定义:

data := make([]byte, 1024)
count, err := input.Read(data) // error handling removed from this snippet
for i:=0; i<count; i++ {
data[i] = mapFunction(data[i])
}

这是我用来代替 reduce() 的方法,其中有 2 个状态变量,当代码遍历 slice 中的每个项目时,我使用它们来跟踪 CSV 中字段的引用:

data := make([]byte, 1024)
count, err := input.Read(data) // error handling removed from this snippet
for i:=0; i<count; i++ {
data[i], stateVariable1, stateVariable2 =
reduceFunction(data[i], stateVariable1, stateVariable2)
}

这是我的问题:

  1. 是否有我错过的内置功能?
  2. 对其中的每一个使用可变 slice 是否合适?
  3. 为 map() 使用 goroutines 是个好主意吗?这是否允许解耦读取文件的 IO 操作和在每个项目上运行映射函数的进程,从而允许并行化?
  4. 说 goroutines 不适合 reduce() 函数是否正确,因为 2 个状态变量由所有前面的数据定义,并且必须按顺序进行。换句话说,这个顺序过程不能从并发架构中受益?

谢谢!

ps - 完整代码在这里:https://github.com/dbro/csvquote/blob/go/csvquote.go

最佳答案

简而言之:

  1. 没有,没有内置的 map 或 reduce。
  2. 是的。还有什么?
  3. 没有。如果没有事先衡量或一些已证实的真正需要,甚至不要考虑这些东西。
  4. 是的。

有点长。

  1. Go 没有功能,没有 map/reduce 内置函数或在标准库中
  2. Go 中有数组和 slice 。两者都是可变的。大多数时候 slice 是自然选择。
  3. 过早的优化...,但当然:读取处理可以进入一个循环并将输入包装在 bufio.Reader 中可能是个好主意。
  4. Goroutines 很好,它们允许不同类型的程序构建,但这并不意味着它们可以用于所有事情。没有必要通过引入 goroutines 来复杂化一个非常清晰的 for 循环。

关于concurrency - map() 和 reduce() 是否适合 Go 中的并发处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16629346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com