Go 从频道片段中选择(发送到空闲频道)?
我正在发出多个http请求: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(
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)
}