Как программа выполняет функцию Poller бесконечно, когда канал «in» в функции poller (который получает от основной функции) запускает только 3 процедуры проверки poller?
Таким образом, первая программа создает два пуллеров:
for i := 0; i < numPollers; i++ {
go Poller(pending, complete, status)
}
затем посылает три ресурса в ожидание:
for _, url := range urls {
pending <- &Resource{url: url}
}
Каждого Poller считываемых из очереди и опросов ресурса:
for r := range in {
s := r.Poll()
status <- State{r.url, s}
out <- r
}
Этот код исполняет бесконечно, но он блокирует чтение из очереди, как правило. Таким образом, эти циклы ждут появления следующего значения. практически шаг
Давайте над ним:
- Существует два пуллеров чтения ресурсов.
- Программа отправляет первый ресурс в очередь.
- Один из опылителей получает ресурс и начинает пул. Другой ждет.
- В какой-то момент программа отправляет новый ресурс в очередь.
- Как первый опроллер занят, второй разблокируется и начинает опрос.
- Программа отправляет третий ресурс и блокирует, поскольку два участника были заняты.
- Когда один из опылителей завершает работу, он берет последний ресурс и продолжает.
- В то же время основная программа считывает значения из полной очереди.
for r := range in { s := r.Poll() status <- State{r.url, s} out <- r }
Как этот код работать бесконечно? Если он перебирает канал «in», а «in» получает свои ресурсы из ожидающей очереди, он должен заканчиваться после нескольких итераций. Я думаю, что это именно та часть, которую я не понимаю.
Чтобы уточнить, in
не получает ресурсы от pending
очереди. in
pending
очереди. Очередь (или канал, которую я использую взаимозаменяемо) можно закрыть, вызвав close, но пока она не будет закрыта явно, она считается живой. Любое чтение из него блокирует текущий goroutine, пока не будет указано следующее значение. Затем возобновляется роротин.
Предполагаю, что вы продолжаете думать о каналах, как о массиве с фиксированным количеством элементов. Они не. Подумайте, что они любят массив с бесконечным количеством элементов, но с блокировкой чтения, которое может генерировать исключение (что приблизительное приближение закрытия очереди, если вы не знакомы с понятием).
'для г: = в диапазоне { S: = r.Poll() статус <- Государство {r.url, s} из <- г }' Как делает этот код бегать бесконечно? Если он перебирает канал «in», а «in» получает свои ресурсы из ожидающей очереди, он должен заканчиваться после нескольких итераций. Я думаю, что это именно та часть, которую я не понимаю. Особенно это происходит в этом разделе. Спасибо за ваше пошаговое объяснение. – Sunil
обновил мой ответ –