Ограничение одновременного выполнения горутины
Рассмотрим сценарий, в котором у вас есть список URL-адресов для обработки и вы хотите ограничить количество одновременно выполняемых горутинов . Например, если у вас 30 URL-адресов, вам может потребоваться только 10 горутин, работающих параллельно.
Приведенный код пытается использовать буферизованный канал размера параллельный, чтобы ограничить количество запущенных горутинов. . Однако этот подход, похоже, не блокируется после обработки всех URL-адресов. Более эффективный способ достичь этого ограничения параллелизма — создать определенное количество рабочих горутин и передать им URL-адреса через выделенный канал.
Вот улучшенная версия кода:
parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()
urls := flag.Args()
// Create a channel to hold URLs that workers will consume
workerURLChan := make(chan string)
// Start a goroutine to feed URLs to the workers
go func() {
for _, u := range flag.Args() {
workerURLChan В этом обновленном коде мы создаем рабочую горутину для каждого разрешенного одновременного выполнения, и эти рабочие функции получают URL-адреса из выделенного канала. После того, как все URL-адреса будут распределены, workerURLChan закрывается, что приводит к выходу рабочих процессов после завершения их текущего URL-адреса. Этот механизм эффективно ограничивает количество одновременно выполняемых горутин.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3