为了账号安全,请及时绑定邮箱和手机立即绑定

使用 gooutins 和渠道的并发受限消费者

使用 gooutins 和渠道的并发受限消费者

Go
牛魔王的故事 2021-06-29 13:57:02
我试图重现“良好管理资源的方法是启动固定数量的句柄 goroutines,所有这些 goroutines 都从请求通道读取。” 从Effective Go 中发现fatal error: all goroutines are asleep - deadlock!这个想法很简单:有 1 个队列和 1 个结果通道和几个有限数量的“工人”。我的代码在 Go Playgroundqueue := make(chan *Request)result := make(chan int)quit := make(chan bool)go Serve(queue, quit)for i := 0; i < 10; i++ {    req := Request{i, result}    queue <- &req}close(queue)for i := 0; i < 10; i++ {    fmt.Printf("Finished %d\n", <-result)}fmt.Printf("All finished\n")quit <- true功能服务:func handle(queue chan *Request) {    for r := range queue {        //process(r)        fmt.Printf("Processing %d\n", r.i)        r.r <- r.i    }}func Serve(clientRequests chan *Request, quit chan bool) {    MaxOutstanding := 2    // Start handlers    for i := 0; i < MaxOutstanding; i++ {        go handle(clientRequests)    }    <-quit // Wait to be told to exit.}怎么了?或者可能有更简单的解决方案来实现数量有限的处理请求的工人?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信