gpt4 book ai didi

golang 从同一个 channel 读写

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

问题代码为:

go func() {
defer wg.Done()
for {
task := <-tasks

if task.Attemts >= .5 {
tasks <- task # <- error
}

Println(task)
}
}()

填充 tasks <- Task{"1", rand.Float64()} 的任务在另一个循环中。

现在我们陷入了僵局...

完整示例:https://play.golang.org/p/s1pnb1Mu_Y

我的代码的重点是 - 创建 web scraper ,它会在失败后尝试解析 url。进行一些尝试,然后删除 url。

可能在 golang 中我们有一些更理想的方法来解决这个问题,因为我不知道。

最佳答案

您正在使用非缓冲 channel ,因此当您尝试使用 tasks <- task 发送时该 goroutine 中的执行坐在那里等待在 channel 上读取其他内容。由于没有其他内容在 channel 上阅读,您会陷入僵局。

使这个特定代码工作的唯一方法是拥有一个完全专用的消费者或使用缓冲 channel 。即使这里有一个缓冲 channel ,如果缓冲区在您的单个消费者尝试发送时已满,您也可能会遇到死锁。

如果你真的需要从同一个 goroutine 发送,你将不得不生成一个新的 goroutine 来发送它。类似的东西

go func() {
tasks <- task
}()

或者你可以有这样的东西:

requeue = make(chan Task) // could buffer if you want
go func() {
for {
tasks <- requeue
}
}()
for {
task := <-tasks

if task.Attemts >= .5 {
requeue <- task
}

Println(task)
}

当然是处理那个 channel 的关闭等等。

关于golang 从同一个 channel 读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796510/

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