| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Anyevent::HTTP |
| Автор: HeinzFelfe 6.12.2012, 18:01 |
| Преступил к изучению anyevent::http. Возникают вопросы, может кто сталкивался с подобным уже. И так, в предпологаемой программе берется спискок прокси-серверов (пусть их там будет 1000 штук), и по каждому из них, через цикл, выполняется get запрос. Необходимо при получении кода состояния HTTP '200 ok' выходить из цикла и не дожидаться ответа от уже посланных запросов. Как это сделать я не понмаю. У меня получается так: приходит ответ 200 ok, вызываю $cv->cend, но цикл продолжает выполняться. использовать exit нельзя, т.к. мы должны остаться в программе. return так же не работает. Как быть? p.s. в английском не силён, так что чтение мануалов официальных весьма затруднено... |
| Автор: DurRandir 6.12.2012, 18:13 | ||
Увы, но вся документация будет только на cpan и только на английском. Вот нужный кусок документации: When called in void context, nothing is returned. In other contexts, http_request returns a "cancellation guard" - you have to keep the object at least alive until the callback get called. If the object gets destroyed before the callback is called, the request will be cancelled. |
| Автор: HeinzFelfe 6.12.2012, 18:37 | ||
Можете пояснить о каком объекте идет речь? |
| Автор: HeinzFelfe 6.12.2012, 19:12 | ||||||||
| Возможно я не корректно задал вопрос, может пример с конкретным кодом поможет. прокси должны лежать в файле log.txt вот для примера список прокси-серверов США: 74.112.203.107:3128 67.208.247.132:3128 96.47.230.49:8080 96.47.230.49:3128 74.221.211.117:8080 198.154.114.100:8080 173.213.113.211:3128 192.211.49.210:3128 198.144.176.54:8080 199.119.76.111:3128 74.112.203.107:8080 74.94.44.210:8080 198.144.176.54:3128 199.119.76.111:8080 74.221.211.117:3128 173.242.117.146:8080 173.213.113.211:8080 173.242.117.146:3128 198.154.114.100:3128 192.211.49.210:8080
Если запустить скрипт первый раз, и задать какой-нибудь хост, ya.ru, например, то все отрабоатет нормально, но если после этого снова задать какой-нибудь хост, то сначала будут выведены результыта из прошлого запуска. Что бы было понятней вот пример запуска:
т.е. в первом запуске он получил ответ 200 для некоторого прокси-адреса (от которого быстрее ответ пришёл) а остальные 18 штук выведины не были:
И при повторном вводе google.com, он сначала выводит 4 результата (начиная с 3 и до 6) (видимо до прихода статуса 200 успел сделать всего 6 запрсов) из прошлого вызова, и только оптом начинает выводит результаты для нового запроса:
Добавлено через 7 минут и 24 секунды Вот как мне сбросить остальные запросы, которые послались параллельно с запросом от котрого получен статус 200? |
| Автор: HeinzFelfe 6.12.2012, 19:30 |
| Так, что-то начинает прояснятся в голове. Получается, что вот эти запросы из первого запуска, они уже выполнены, т.е. что успело запросится и вернуться ответ, то и выводится ни каких лишних запросов из первого вызова не выполняется. Осталось понять как их можно заставить не выводиться. |
| Автор: DurRandir 7.12.2012, 01:14 | ||
Что-то в духе
PS: объект - это тот, который вернёт вызов http_* PPS: Подумав ещё. Не очень красивый код для определения условия "всё пропало". Посмотрите кусок документации http://search.cpan.org/~mlehmann/AnyEvent-7.04/lib/AnyEvent.pm#METHODS_FOR_PRODUCERS, в части $cv->begin, про AND/OR. |
| Автор: HeinzFelfe 7.12.2012, 02:40 | ||||||||
Да, за код извиняюсь, писал на скорую руку, для демонстрации наглядной. Спасибо за ответы и ссылки (и за места где именно копать в них)). Кстати, в приведенном вами коде появляется странная особенность. Покажу на примере: Запускаем скрипт
Если подождать, и не вводить сразу данные для следующей итерации, а ввести их секунд через 10, то вылезет вот такая штука, причем в один момент, без задержек
Причем есть прямая зависимость от величены таймаута
Чем он меньше, тем меньше нужно жадть. Т.е. получается, в то время как программа ожидает ввод данных (новго адреса) где-то на фоне тикает тайм-аут, который в итоге может полностью истеч. Как такое может быть? И как с этим бороться? p.s. время ожидания, что бы вывелся на экран такой фокус, вроде как полностью совпадает с заданным тайм-аутом. p.p.s. проблема с неостанавливающимся таймером была и раньше как выяснилось. Т.е. и до введения переменной @guards и её очистки. Но как тогда задавать тайм-аут? Как добиться прекращения его истечения уже после выхода из колбэка... |
| Автор: HeinzFelfe 7.12.2012, 19:27 |
| новые подробности. Если изменить значение $AnyEvent::HTTP::MAX_PER_HOST=100; на стандартное 4 то результат 595 будет возвращаться только для первых 4 адресов. Т.е. код 595 приходит только для первой партии запросов и если $AnyEvent::HTTP::MAX_PER_HOST=100 то для первой сотни всегда будет приходит значение 595. Как с этим бороться по прежнему неясно. |
| Автор: HeinzFelfe 7.12.2012, 20:13 |
| Расследование продолжается. При убирании из запроса информации о прокси, ошибка пропадает. Все дело в них, проксюшах, но вот в чем конкретно не ясно. 595 - errors during connection etsbalishment, proxy handshake - мало о чем мне говорит. |