gpt4 book ai didi

go - 循环异步进程

转载 作者:行者123 更新时间:2023-12-03 10:09:09 25 4
gpt4 key购买 nike

当我编写一个用于处理文件列表的应用程序时,我希望通过使处理和文件读取部分异步运行来加快处理速度。在shell中,我曾经为处理功能设置背景,但在其之前加了“等待”以确保任何先前的处理完成。我在Go中使用缓冲 channel 作为一种互斥体,找到了一种实现此目的的方法,但我不禁想到必须有一种更优雅的方法。例如,我有类似

rdy := make(chan int, 1)
rdy <- 1
for f := range fileList {
data := MyReadFile(f)
<-rdy
go func() {
MyProcess(data)
rdy <- 1
}()
}
<-rdy
我认为必须有一种使用无缓冲 channel 的方法,但是我无法弄清楚如何在循环的第一次迭代之前将其设置为“就绪”状态。也就是说,在循环的第一次迭代中对 <-rdy的调用一定不能阻塞。

最佳答案

我会尝试这样的事情:

func main() {
var wg sync.WaitGroup
files := []string{"0", "1", "2", "3"}
data := make(chan string)

wg.Add(len(files))
for _, f := range files {
go MyReadFile(f, data)

go func() {
MyProcess(data)
wg.Done()
}()
}
wg.Wait()
}

func MyReadFile(f string, data chan<- string) {
data <- f // send file content
}

func MyProcess(data <-chan string) {
content := <-data
fmt.Println(content) // sample process
}
MyProcess等待直到MyReadFile将内容发送到数据 channel 的地方,并且 WaitGroup 将确保继续处理所有文件。
游乐场: https://play.golang.org/p/_tsyZK8LvZv
除了传递字符串到 channel 外,您还可以传递[] byte。希望这对您有所帮助。

关于go - 循环异步进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65972210/

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