Как ограничить go подпрограмм на основе количества файловых дескрипторов - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть программа, которая выполняет запросы к HTTP-серверу, каждый запрос получает программу. Я быстро обнаружил, что это слишком много для MacOS, так как ограничение дескриптора файла составляет 250.

Мне было интересно, смогу ли я ограничить количество процедур или, возможно, заблокировать их, пока не появятся доступные программы вместо сбой.

Может быть рабочий пул с 250 программами и очередями остальных запросов?

Что вы думаете

1 Ответ

2 голосов
/ 12 февраля 2020
package main

import "fmt"

const ROUTINE_LIMIT = 250

func main() {

    channelCounter := make(chan bool, ROUTINE_LIMIT)

    for {
        select {
        //will add till 250 after that it will block
        case channelCounter <- true:
            fmt.Println("added channel")
            go startRoutine(channelCounter)
        }
    }
}

func startRoutine(channelCounter chan bool) {
    /*
        do your stuff
    */

    //free the channel
    <-channelCounter
}

Вы можете ограничить количество горуотина, используя каналы. Канал для подсчета количества запущенных подпрограмм go. И как только задание выполнено, вы можете прочитать значение канала, чтобы уменьшить количество.

Вышеприведенная программа похожа на примерный код .. (я думаю, что он охватывает общую идею)

...