2009-02-24 87 views
3

我有两个Web请求,我需要轮询以找出它们何时返回。理想情况下,我不想在严密的循环中继续测试它们。我想释放CPU以便其他进程可以执行。如何在不阻塞的情况下轮询Web请求?

我正在使用Perl的Time :: HiRes :: sleep(0.100)函数在测试Web请求是否返回之前释放CPU。

在负载测试过程中,我可以看到睡眠持续时间'延长'。理想情况下,我想确保睡眠持续时间得到遵守,但CPU已经释放。我应该调用一个不同的功能来实现这个功能吗?

我在Linux 2.6上编写Perl。

回答

14

而不是轮询,看看你是否无法获得文件描述符并进行select调用。

然后,一旦发生任何事情,您就可以控制回来,而不占用CPU。

Web请求中的某处会有一些套接字,并且附加到套接字上的将是可用于select的文件描述符。

无论如何,你的程序可以在任何时间点被中断任何时间量;如果这是一个真正的问题,你需要一个实时操作系统,但由于你正在处理网络请求,我怀疑你需要这样的响应水平。

事实上,你想要的是一个高层次的接口,为你选择呼叫。正如评论中所建议的那样:http://search.cpan.org/dist/HTTP-Async/看起来像它会做你所需要的。

+0

这就是HTTP ::异步在底层所做的 - 看看代码,看看它是如何完成的:http://search.cpan.org/dist/HTTP-Async/ – EvdB 2009-02-26 13:08:50

1

我不认为在普通的Linux上可以保证睡眠时间。这几乎是“实时”操作系统的重点,而普通的Linux不是“实时”。

我同意@Douglas Leeder:使用select调用来在内容发生变化时通知您。你也可以使用select调用来模拟亚秒钟睡眠,但Time :: HiRes是一个更清洁的界面(并且你仍然不会避免等待)。

相关问题