Как я могу опрашивать веб-запросы без блокировки? - PullRequest
3 голосов
/ 24 февраля 2009

У меня есть два веб-запроса, которые мне нужно опросить, чтобы узнать, когда они вернутся. В идеале я не хочу продолжать тестировать их в узком кругу. Я хотел бы освободить процессор, чтобы могли выполняться другие процессы.

В настоящее время я использую функцию Perl Time :: HiRes :: sleep (0.100), чтобы освободить процессор перед проверкой, вернулись ли веб-запросы.

Во время тестирования под нагрузкой я вижу, что продолжительность сна «растягивается». В идеале я хочу убедиться, что продолжительность сна соблюдена, но процессор освобожден. Должен ли я вызывать другую функцию для достижения этой цели?

Я пишу Perl в Linux 2.6.

Ответы [ 3 ]

14 голосов
/ 24 февраля 2009

Вместо того, чтобы опросить, посмотрите, не можете ли вы получить дескрипторы файлов и сделать вызов select.

Тогда вы получите контроль, как только что-нибудь произойдет, вообще не занимая ЦП.

Где-то в веб-запросе будет несколько сокетов, и к сокетам будут прикреплены файловые дескрипторы, которые вы можете использовать в select.

В любом случае ваша программа может быть прервана в любой момент на любое количество времени; если это реальная проблема, вам нужна операционная система реального времени, но, поскольку вы имеете дело с веб-запросами, я сомневаюсь, что вам нужен такой уровень реагирования.

На самом деле вам нужен интерфейс высокого уровня, который выполняет вызов select для вас. Как предлагается в комментариях: http://search.cpan.org/dist/HTTP-Async/ похоже, что он будет делать именно то, что вам нужно.

2 голосов
/ 24 февраля 2009

Звучит так, будто вы действительно хотите цикл событий. Есть POE , EV и слоев абстракции над и .

В любом случае, не выполняйте это самостоятельно. Это колесо уже был изобретен.

1 голос
/ 24 февраля 2009

Я не думаю, что продолжительность сна может быть гарантирована на обычном Linux. В этом и заключается суть операционной системы «Real Time», а обычный Linux - это не «Real Time».

Я согласен с @Douglas Leeder: используйте вызов select, чтобы ядро ​​сообщило вам, когда что-то изменится. Вы также можете эмулировать подсекундные сны с помощью вызова select, но Time :: HiRes является более понятным интерфейсом (и вы все равно не избежите растягивания ожидания).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...