gpt4 book ai didi

concurrency - 使用并发的 Golang 流水线

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:15 29 4
gpt4 key购买 nike

Go 新手。我正在尝试编写一个“流水线”,其中多个函数像 worker 一样工作,并在流水线中将一些数据结构传递给彼此,每个函数都对数据结构做一些事情。

type orderStruct struct {
orderNum,capacity int
orderCode uint64
box [9]int
}


func position0(in chan orderStruct){

order := <-in

if((order.orderCode<<63)>>63 == 1){
order.box[order.capacity] = 1
order.capacity += 1
}

fmt.Println(" filling box {", order.orderNum, order.orderCode, order.box, order.capacity, "} at position 0")
}

func startOrder(in chan orderStruct){

order := <-in

fmt.Printf("\nStart an empty box for customer order number %d , request number %d\n", order.orderNum, order.orderCode)
fmt.Println(" starting box {", order.orderNum, order.orderCode, order.box, order.capacity, "}")

d := make(chan orderStruct,1)
go position0(d)
d <- order
}

func main() {

var orders [10]orderStruct
numOrders := len(os.Args)-1
var x int

for i := 0; i < numOrders; i++{
x, _ = strconv.Atoi(os.Args[i+1])
orders[i].orderCode = uint64(x)
orders[i].orderNum = i+1
orders[i].capacity = 0
for j := 0; j < 9; j++{
orders[i].box[j] = 0
}
c := make(chan orderStruct)
go startOrder(c)
c <- orders[i]
}
}

所以基本上我遇到的问题是 startOrder() 中的打印语句执行得很好,但是当我尝试将结构传递给 position0() 时,没有打印任何内容。我是否误解了 channel 的运作方式?

最佳答案

学习在 Go 中并发编程时,流水线是一个很好的起点。 Nick Craig-Wood 的回答为这一特定挑战提供了可行的解决方案。

在 Go 中还有很多其他方法可以使用并发。从广义上讲,根据被视为并发的内容分为三类:

  • 功能分解 - 创建多个功能的管道是开始的好方法 - 也是您问题的主题。这很容易思考并且很有成效。但是,如果发展到真正的并行硬件,就很难很好地平衡负载。一切都以最慢管道阶段的速度进行。

  • 几何分解 - 将数据分成可以独立处理(或无需过多通信)的单独区域。基于网格的系统广泛用于科学高性能计算的某些领域,例如天气预报。

  • Farming - 确定如何将要完成的工作分解为(大量)任务,并将这些任务一个接一个地分配给“ worker ”,直到全部完成.通常,任务的数量超过 worker 的数量。此类别包括所有所谓的“令人尴尬的并行”问题(令人尴尬,因为如果您未能让您的高性能系统提供线性加速,您看起来有点愚蠢)。

我可以添加上述几种的第四类混合体。

有很多关于此的文献,包括 80 年代和 90 年代 Occam 编程时代的许多文献。 Go 和 Occam 都使用 CSP 消息传递,所以问题很相似。我会挑出有用的书 Practical Parallel Processing: An introduction to problem solving in parallel (Chalmers 和 Tidmus 1996)。

关于concurrency - 使用并发的 Golang 流水线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27366227/

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