gpt4 book ai didi

go - 如何使用 WaitGroup 处理工作池中的错误?

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

我在使用 sync.WaitGroupselect 时遇到问题。如果您查看以下 http 请求池,您会注意到如果发生错误,它将永远不会被报告为 wg.Done() 将阻塞并且不再从 channel 读取。

package pool

import (
"fmt"
"log"
"net/http"
"sync"
)

var (
MaxPoolQueue = 100
MaxPoolWorker = 10
)

type Pool struct {
wg *sync.WaitGroup

queue chan *http.Request
errors chan error
}

func NewPool() *Pool {
return &Pool{
wg: &sync.WaitGroup{},

queue: make(chan *http.Request, MaxPoolQueue),
errors: make(chan error),
}
}

func (p *Pool) Add(r *http.Request) {
p.wg.Add(1)

p.queue <- r
}

func (p *Pool) Run() error {
for i := 0; i < MaxPoolWorker; i++ {
go p.doWork()
}

select {
case err := <-p.errors:
return err
default:
p.wg.Wait()
}

return nil
}

func (p *Pool) doWork() {
for r := range p.queue {
fmt.Printf("Request to %s\n", r.Host)

p.wg.Done()

_, err := http.DefaultClient.Do(r)

if err != nil {
log.Fatal(err)

p.errors <- err
} else {
fmt.Printf("no error\n")
}
}
}

来源可以找到here

如何才能在使用 WaitGroup 的同时从 go routines 中获取错误?

最佳答案

我自己在写问题时得到了答案,因为我认为这是一个有趣的案例,所以我想与您分享。

一起使用 sync.WaitGroupchan 的技巧是我们包装:

select {
case err := <-p.errors:
return err
default:
p.wg.Done()
}

一起在 for 循环中:

for {
select {
case err := <-p.errors:
return err
default:
p.wg.Done()
}
}

在这种情况下,select 将始终检查错误并在没有任何反应时等待 :)

关于go - 如何使用 WaitGroup 处理工作池中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24715754/

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