gpt4 book ai didi

go - 按顺序同时执行作业

转载 作者:IT王子 更新时间:2023-10-29 02:07:02 25 4
gpt4 key购买 nike

“什么?”你问,“这个标题没有任何意义。”

考虑以下几点: enter image description here不同 id 的作业可以异步处理,但相同 id 的作业应该同步处理,并从队列中按顺序处理。

我当前的实现创建了一个 go 例程来处理每个特定 id 的作业,看起来像这样:

func FanOut() chan<- *Job {
channel := make(chan *Job)
routines = make(map[string]chan<- *Job)
go func() {
for j := range channel {
r, found := routines[j.id]
if !found {
r = Routine()
routines[j.id] = r
}
r <- j
}
}()
return channel
}

这似乎运行良好(在当前测试中),但创建数千个 go 例程可能不是最好的方法?此外,除非使用缓冲 channel ,否则扇出代码块。

我正在考虑使用 sync.Mutex 的集合,而不是 go 例程的集合(上图)。这个想法是有一个 go 例程池,它必须首先在对应于作业 id 的互斥锁上建立一个锁。

是否有任何现有的 Go 模式适合处理这些要求?

有更好的方法吗?

最佳答案

为每个 ID 创建一个 channel - 可能是一片 channel 或一张 map (按 ID 索引)。每个 channel 都有一个按顺序处理该 ID 的作业的 go-routine。很简单。

我不会担心创建太多 go-routines。而且我不会使用互斥锁 - 如果不使用 channel 和 go-routines 进行太多细节,那么每个作业一次只能由一个 go-routines 处理,并避免数据竞争的可能性。

顺便说一句,我只添加了这个作为答案,因为我不允许添加评论(还没有?)。

关于go - 按顺序同时执行作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55730273/

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