2009-02-24 2 views
3

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

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

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

Я кодирую Perl на Linux 2.6.

ответ

14

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

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

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

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

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

+0

Это то, что HTTP :: Async делает под капотом - взгляните на код, чтобы посмотреть, как это делается: http://search.cpan.org/dist/HTTP-Async/ – EvdB

+0

Это как раз то, что я имел ввиду. –

1

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

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

2

Похоже, вы действительно хотите, чтобы цикл событий. Существует POE, EV и abstraction layers over both.

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

Смежные вопросы