gpt4 book ai didi

go - 与 channel 同时写入

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

我写了一个简短的脚本来同时写入一个文件。一个 goroutine 应该将字符串写入文件,而其他 goroutine 应该通过 channel 将消息发送给它。但是,由于某些非常奇怪的原因,文件已创建,但没有通过 channel 向其中添加任何消息。

package main

import (
"fmt"
"os"
"sync"
)

var wg sync.WaitGroup
var output = make(chan string)

func concurrent(n uint64) {
output <- fmt.Sprint(n)
defer wg.Done()
}

func printOutput() {
f, err := os.OpenFile("output.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666);
if err != nil {
panic(err)
}
defer f.Close()

for msg := range output {
f.WriteString(msg+"\n")
}
}

func main() {
wg.Add(2)
go concurrent(1)
go concurrent(2)
wg.Wait()
close(output)
printOutput()
}

printOutput() goroutine 被完全执行,如果我试图在 for 循环之后写一些东西,它实际上会进入文件。所以这让我认为范围输出可能为空

最佳答案

你需要从输出 channel 中获取一些东西,因为它是阻塞的,直到有东西移除你放在它上面的东西。

这不是唯一/最好的方法,但是:我将 printOutput() 移动到其他函数之上并将其作为 go 例程运行,它可以防止死锁。

package main

import (
"fmt"
"os"
"sync"
)

var wg sync.WaitGroup
var output = make(chan string)

func concurrent(n uint64) {
output <- fmt.Sprint(n)
defer wg.Done()
}

func printOutput() {
f, err := os.OpenFile("output.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
if err != nil {
panic(err)
}
defer f.Close()

for msg := range output {
f.WriteString(msg + "\n")
}
}

func main() {
go printOutput()
wg.Add(2)
go concurrent(1)
go concurrent(2)
wg.Wait()
close(output)
}

关于go - 与 channel 同时写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37312926/

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