Как в Go контролировать количество горутинов?

Доброго времени суток! Нужно на го сделать некое подобие web паука. Механизм по идее простой:
Есть некое кол-во ссылок. Каждая ссылка запускается в своем "потоке". При нахождении ссылок определенного типа она должна добавиться в общую очередь. Количество потоков ограничено настройками. При завершении работы над страницей поток закрывается и на его место должен встать новый поток из очереди. Никак не соображу как это реализовать. Каков механизм контроля общего количества потоков?
  • Вопрос задан
  • 2843 просмотра
Решения вопроса 2
sgjurano
@sgjurano
Разработчик
Классическая идея (ещё из C) - делать это с помощью каналов, вот как это должно быть устроено:
вы заводите канал, который будет играть роль семафора (мьютекса со счетчиком), пишете туда столько байт, сколько хотите максимум запускать сопрограмм, перед запуском каждой из них вычитываете один байт из канала, при завершении пишете его туда же. Таким нехитрым образом вы получаете ограничение сверху на число одновременно запущенных сопрограмм.

Вот пример кода:
5bc32f5fdd143124004584.jpeg

Из вот этой книжки, рекомендую прочитать, кстати:
5bc32f687decc787834192.jpeg
Ответ написан
Комментировать
axifive
@axifive
Software Engineer
Как и в других многопоточных языках, уже существует достаточное колличество готовых реализаций Worker Pool (Goroutine Pool)

Вот списки пакетов на github реализующих этот функционал: ссылка и ссылка
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы