Я делаю несколько запросов http:
type item struct{
me []byte
}
items := getItems()
for _, me := range items {
me.save()
}
Для того, чтобы сделать это эффективно, я делаю это с рутинами го, мой первый подход состоял в том, чтобы сделать его похожим на пул рутин:
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-запрос одновременно, и некоторые из них терпят неудачу, потому что моя пропускная способность не может справиться со всеми ними.
Поэтому я пробую каналы вместе с select
вместо:
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:
}
}
Но, добавив больше процедур go, чтобы найти максимальные процедуры go, которые может обработать мой bandwidht, мой код становится все больше и больше, и я пытаюсь сделать это:
max:=7
var channels []chan item
for i:=0;i<max;i++{
channel=make(chan item)
channels=append(channels,channel)
}
for _, me := range items {
select {
//???????????????
}
}
но я не совсем уверен, как это сделать как последний подход
Также имейте в виду, что вопрос «Выбрать из множества каналов» уже задавался, но их ответы были только тогда, когда select
прослушивает, какой канал прибывает первым, в моем случае я хочу, чтобы Select
отправил любой свободный канал. так что это отличается