我有两个网络请求,我需要轮询以查明他们何时返回。理想情况下,我不想继续测试它们。我想释放CPU,以便其他进程可以执行。
我目前正在使用Perl的Time :: HiRes :: sleep(0.100)函数在测试Web请求是否已返回之前释放CPU。
在负载测试期间,我可以看到睡眠持续时间“延伸”。理想情况下,我想确保遵守睡眠持续时间,但CPU已被释放。我应该调用不同的功能来实现这个目标吗?
我在Linux 2.6上编写Perl。
答案 0 :(得分:14)
而不是轮询,看看你是否无法获取文件描述符并进行选择调用。
然后,一旦发生任何事情,您将立即获得控制权,而不会占用CPU。
web请求中的某个地方将是一些套接字,并且附加到套接字将是可以在select中使用的文件描述符。
在任何情况下,您的程序可以在任何时间点中断任何时间;如果这是一个真正的问题,你需要一个实时操作系统,但由于你正在处理网络请求,我怀疑你需要这种级别的响应。
实际上你想要的是一个高级接口,可以为你执行select调用。正如评论中所建议的那样:http://search.cpan.org/dist/HTTP-Async/看起来就像你需要的那样。
答案 1 :(得分:2)
听起来你真的想要一个事件循环。有 POE, EV和abstraction layers over both。
无论哪种方式,都不要自己实现。这个轮已经 被发明了。
答案 2 :(得分:1)
我不认为在常规Linux上可以保证睡眠持续时间。这几乎是“实时”操作系统的重点,常规Linux不是“实时”。
我同意@Douglas Leeder:使用select调用让内核在发生变化时通知您。您还可以使用select调用模拟亚秒级睡眠,但Time :: HiRes是一个更干净的界面(您仍然不会避免延长等待时间。)