| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > создать паузы между запросами в AnyEvent::HTTP |
| Автор: slavenk 1.8.2013, 15:12 | ||
| Здравствуйте! Есть следующий псевдокод (выкачиваются страницы):
Мне нужно создать паузы между запросами в размере примерно 0,5с. Подскажите пожайлуста, как реализовать данный функционал? |
| Автор: ginnie 1.8.2013, 15:15 |
| slavenk, а как Вы уже пробовали, но не получилось? Мне в голову приходит только очевидный вариант, наверное, я неверно понял задачу. Паузу менее секунды можно задать, например, используя функцию Time::HiRes::usleep() или select(undef, undef, undef, 0.5); |
| Автор: slavenk 1.8.2013, 15:23 |
| Пытался через AnyEvent->timer, но выдает ошибку типа segmentation failed. |
| Автор: ginnie 1.8.2013, 15:30 | ||
timer удобно использовать для обработки таймаутов, для Вашей задачи достаточно
|
| Автор: slavenk 1.8.2013, 15:44 |
| Как-то не очень работает - сначела таймер ожидает какое-то время (до обращения к урлам), а потом как обычно без задержек. Здесь скорее всего проблема в асинхронной природе AnyEvent. Просто, если урлов будет много, не хочется завалить сервер запросами. Добавлено через 59 секунд Скорее всего нужно использовать AnyEvent->timer |
| Автор: ginnie 1.8.2013, 17:12 |
| Предлагаю попробовать такой вариант: запросы формируем не до запуска цикла обработки, а внутри него: создаем таймер, в функции которого добавляем запрос, проверяем есть ли еще url, если есть, создаем новый таймер. |
| Автор: slavenk 1.8.2013, 17:41 | ||
Скорее всего да. Суть работы такая: есть список урлов с одного домена (сайта), нужно выкачать страницы по этим урлам. Нужно сделать так, чтобы не сильно нагружать сервер с этого домена. Как вариант я решил использовать задержку при запросе (аналогично как это делает пользователь). Как я понял, запросы на сервер отправляются с задержкой в 0.5 сек, а ответы приходят асинхронно? Просто выглядит это так, что сначала каждые 0.5 сек отдаются запросы, а только потом асинхронно возвращаются ответы. Так оно и есть: если написать такой код:
то сначала будут выдаваться "Yes" по количеству урлов, и только потом выдаются ответы. А можно как-то посмотреть запросы, которые отдает http_get? |
| Автор: ginnie 1.8.2013, 17:46 |
| slavenk, скорее всего там все сложнее и запросы тоже делаются асинхронно, т.е. http_get только формирует задание на запрос, а сам запрос отправляется на сервер уже в цикле обработки. Поэтому я предложил выше делать запросы в цикле обработки. |
| Автор: Pfailed 1.8.2013, 19:35 |
| sleep и его аналог select делать в anyevent цикле нельзя, нужно использовать timer. Вам нужно послать запрос на следующую ссылку через 5 секеунд после того как придёт ответ на предыдущую или через 5 секунд после того как будет послан запрос на предыдущую? |
| Автор: DurRandir 2.8.2013, 00:21 | ||||
В этом коде пауза 0.5 бессмысленна. Вы не передаёте управление в AnyEvent (и, соответственно, не даёте возможность ему отправить в сеть запросы) внутри цикла. Да и вообще, использование в event-driven приложении sleep/select - нехороший признак) Правильный вариант будет выглядеть как-то так:
|
| Автор: ginnie 2.8.2013, 11:24 |
| DurRandir, скажите, а чем Ваш вариант отличается от простой отсылки запросов в цикле вообще без использования AnyEvent? Мне кажется, что не надо привязывать отсылку нового запроса к обработке результата предыдущего. |
| Автор: DurRandir 3.8.2013, 12:27 |
| slavenk так и не сказал, ему важна пауза между отправкой или между обработкой. Этот вариант легко переделывается на паузу между отправкой. PS: да, никакой разницы, если опрашиваем один сайт. А если несколько, поддерживая для каждого свою очередь запросов? |
| Автор: slavenk 5.8.2013, 13:03 |
| Нужна пауза между отправкой, т.е. между запросами |
| Автор: slavenk 5.8.2013, 13:21 |
| Спасибо всем! Понял, что для данной задачи можно обойтись без AnyEvent. |