2009-02-24 116 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是一個更清潔的界面(並且你仍然不會避免等待)。

相關問題