gpt4 book ai didi

go - 使用 channel 来调度任务以进行例程

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

我正在编写一个程序来渲染图表。 Todo 所以我正在搜索所有文件并希望将它们异步分派(dispatch)到 go 例程以并行处理它们。但是我想我误解了 channel 的概念。

files := umlFiles("uml") // list of strings

queue := make(chan string)
for i := 0; i < 4; i++ {
go func(queue chan string) {
file, ok := <-queue
if !ok {
return
}

exec.Command("some command", file).Run()
}(queue)
}
for _, f := range files {
queue <- f
}
close(queue)

这将在处理完前 4 个文件后陷入死锁,但不会继续处理其余文件。

我可以使用 channel 将任务分派(dispatch)给正在运行的 go 例程并在所有任务完成后停止它们吗?如果是这样,上面的代码有什么问题?

曾经到达这里:
how-to-stop-a-goroutine
go-routine-deadlock-with-single-channel

最佳答案

你们很亲近。你遇到的问题是你正在启动 4 个 goroutines,它们都做 1 件工作,然后返回。试试这个吧

for i := 0; i < 4; i++ {
go func(queue chan string) {
for file := range queue {
exec.Command("some command", file).Run()
}
}(queue)
}

一旦队列关闭,这些将返回。

关于go - 使用 channel 来调度任务以进行例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48734453/

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