Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 从频道片段中选择(发送到空闲频道)?_Go_Channel - Fatal编程技术网

Go 从频道片段中选择(发送到空闲频道)?

Go 从频道片段中选择(发送到空闲频道)?,go,channel,Go,Channel,我正在发出多个http请求: type item struct{ me []byte } items := getItems() for _, me := range items { me.save() } 为了提高效率,我使用go-rutines,我的第一个方法是让它像一个go-rutines池: items := getItems() var wg sync.WaitGroup wg.Add(

我正在发出多个http请求:

    type item struct{
       me []byte
    }
    items := getItems()
    for _, me := range items {
          me.save()
    }
为了提高效率,我使用go-rutines,我的第一个方法是让它像一个go-rutines池:

    items := getItems()
    var wg sync.WaitGroup
    wg.Add(len(items))
    for _, me := range items {
        go func(me item) {
            me.save()
            wg.Done()
        }(me)
    }
    wg.Wait()
但它们都试图同时发出http请求,其中一些失败了,因为我的带宽无法处理它们。 因此,我尝试使用
选择
频道:

    channel1 := make(chan item)
    channel2 := make(chan item)
    channel3 := make(chan item)
    var wg sync.WaitGroup
    items := getItems()
    wg.Add(len(items))
    go func() {
        for me := range channel1 {
            me.save()
            wg.Done()
        }
    }()
    go func() {
        for me := range channel2 {
            me.save()
            wg.Done()
        }
    }()
    go func() {
        for me := range channel3 {
            me.save()
            wg.Done()
        }
    }()
    for _, me := range items {
        select {
        case channel1 <- me:
        case channel2 <- me:
        case channel3 <- me:
        }
    }
channel1:=制造(成衣)
通道2:=制造(成龙项目)
通道3:=制造(成龙项目)
var wg sync.WaitGroup
items:=getItems()
工作组添加(len(项目))
go func(){
对我来说:=范围通道1{
救救我
wg.Done()
}
}()
go func(){
对我来说:=范围通道2{
救救我
wg.Done()
}
}()
go func(){
对我来说:=范围通道3{
救救我
wg.Done()
}
}()
对于me:=范围项目{
挑选{
case channel1您可以使用,使用
Dir=SelectSend
创建一段
SelectCase
结构,如下所示:

max:=7
var channels []chan item
for i:=0;i<max;i++{
    channel=make(chan item)
    channels=append(channels,channel)
}
for _, me := range items {
    cases := make([]reflect.SelectCase, max)
    for j := 0; j < max; j++ {
        cases[j] = reflect.SelectCase{
            Dir: reflect.SelectSend,
            Chan: reflect.ValueOf(channels[j]),
            Send: reflect.ValueOf(me)
        }
    }
    reflect.Select(cases)
}
max:=7
var通道[]通道项目

对于i:=0;i我有一个错误的方法,答案很简单

类型项结构{
me[]字节
}

func worker(canalFiles)这是实现工作池的一种…不寻常的方式。为什么不是“标准”方式:一个任务队列,它是一个[buffered]频道和几个工人的goroutines?我试过了,但我没能做到,你能举个例子吗?是的,我想找一篇关于我刚才读过的主题的好博文。啊,在这里,看看:。作者似乎确实被频道迷住了,但评论中也有一些好的提示。我在找一些东西我喜欢这样,但结果是我有一个错误的方法,我最终做了一个错误的决定
max:=7
var channels []chan item
for i:=0;i<max;i++{
    channel=make(chan item)
    channels=append(channels,channel)
}
for _, me := range items {
    cases := make([]reflect.SelectCase, max)
    for j := 0; j < max; j++ {
        cases[j] = reflect.SelectCase{
            Dir: reflect.SelectSend,
            Chan: reflect.ValueOf(channels[j]),
            Send: reflect.ValueOf(me)
        }
    }
    reflect.Select(cases)
}