![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| HeinzFelfe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 15.9.2012 Репутация: нет Всего: нет |
Преступил к изучению anyevent::http.
Возникают вопросы, может кто сталкивался с подобным уже. И так, в предпологаемой программе берется спискок прокси-серверов (пусть их там будет 1000 штук), и по каждому из них, через цикл, выполняется get запрос. Необходимо при получении кода состояния HTTP '200 ok' выходить из цикла и не дожидаться ответа от уже посланных запросов. Как это сделать я не понмаю. У меня получается так: приходит ответ 200 ok, вызываю $cv->cend, но цикл продолжает выполняться. использовать exit нельзя, т.к. мы должны остаться в программе. return так же не работает. Как быть? p.s. в английском не силён, так что чтение мануалов официальных весьма затруднено... Это сообщение отредактировал(а) HeinzFelfe - 6.12.2012, 18:07 |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 1 Всего: 17 |
Увы, но вся документация будет только на 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 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 15.9.2012 Репутация: нет Всего: нет |
Можете пояснить о каком объекте идет речь? |
|||
|
||||
| HeinzFelfe |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 15.9.2012 Репутация: нет Всего: нет |
Возможно я не корректно задал вопрос, может пример с конкретным кодом поможет.
прокси должны лежать в файле 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:14 |
||||||||
|
|||||||||
| HeinzFelfe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 15.9.2012 Репутация: нет Всего: нет |
Так, что-то начинает прояснятся в голове.
Получается, что вот эти запросы из первого запуска, они уже выполнены, т.е. что успело запросится и вернуться ответ, то и выводится ни каких лишних запросов из первого вызова не выполняется. Осталось понять как их можно заставить не выводиться. |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 1 Всего: 17 |
Что-то в духе
PS: объект - это тот, который вернёт вызов http_* PPS: Подумав ещё. Не очень красивый код для определения условия "всё пропало". Посмотрите кусок документации http://search.cpan.org/~mlehmann/AnyEvent-...S_FOR_PRODUCERS, в части $cv->begin, про AND/OR. Это сообщение отредактировал(а) DurRandir - 7.12.2012, 01:25 |
|||
|
||||
| HeinzFelfe |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 15.9.2012 Репутация: нет Всего: нет |
Да, за код извиняюсь, писал на скорую руку, для демонстрации наглядной. Спасибо за ответы и ссылки (и за места где именно копать в них)). Кстати, в приведенном вами коде появляется странная особенность. Покажу на примере: Запускаем скрипт
Если подождать, и не вводить сразу данные для следующей итерации, а ввести их секунд через 10, то вылезет вот такая штука, причем в один момент, без задержек
Причем есть прямая зависимость от величены таймаута
Чем он меньше, тем меньше нужно жадть. Т.е. получается, в то время как программа ожидает ввод данных (новго адреса) где-то на фоне тикает тайм-аут, который в итоге может полностью истеч. Как такое может быть? И как с этим бороться? p.s. время ожидания, что бы вывелся на экран такой фокус, вроде как полностью совпадает с заданным тайм-аутом. p.p.s. проблема с неостанавливающимся таймером была и раньше как выяснилось. Т.е. и до введения переменной @guards и её очистки. Но как тогда задавать тайм-аут? Как добиться прекращения его истечения уже после выхода из колбэка... Это сообщение отредактировал(а) HeinzFelfe - 7.12.2012, 12:47 |
||||||||
|
|||||||||
| HeinzFelfe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 15.9.2012 Репутация: нет Всего: нет |
новые подробности.
Если изменить значение $AnyEvent::HTTP::MAX_PER_HOST=100; на стандартное 4 то результат 595 будет возвращаться только для первых 4 адресов. Т.е. код 595 приходит только для первой партии запросов и если $AnyEvent::HTTP::MAX_PER_HOST=100 то для первой сотни всегда будет приходит значение 595. Как с этим бороться по прежнему неясно. Это сообщение отредактировал(а) HeinzFelfe - 7.12.2012, 19:29 |
|||
|
||||
| HeinzFelfe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 15.9.2012 Репутация: нет Всего: нет |
Расследование продолжается.
При убирании из запроса информации о прокси, ошибка пропадает. Все дело в них, проксюшах, но вот в чем конкретно не ясно. 595 - errors during connection etsbalishment, proxy handshake - мало о чем мне говорит. Это сообщение отредактировал(а) HeinzFelfe - 7.12.2012, 20:14 |
|||
|
||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |