我有兩個Web請求,我需要輪詢以找出它們何時返回。理想情況下,我不想在嚴密的循環中繼續測試它們。我想釋放CPU以便其他進程可以執行。如何在不阻塞的情況下輪詢Web請求?
我正在使用Perl的Time :: HiRes :: sleep(0.100)函數在測試Web請求是否返回之前釋放CPU。
在負載測試過程中,我可以看到睡眠持續時間'延長'。理想情況下,我想確保睡眠持續時間得到遵守,但CPU已經釋放。我應該調用一個不同的功能來實現這個功能嗎?
我在Linux 2.6上編寫Perl。
我有兩個Web請求,我需要輪詢以找出它們何時返回。理想情況下,我不想在嚴密的循環中繼續測試它們。我想釋放CPU以便其他進程可以執行。如何在不阻塞的情況下輪詢Web請求?
我正在使用Perl的Time :: HiRes :: sleep(0.100)函數在測試Web請求是否返回之前釋放CPU。
在負載測試過程中,我可以看到睡眠持續時間'延長'。理想情況下,我想確保睡眠持續時間得到遵守,但CPU已經釋放。我應該調用一個不同的功能來實現這個功能嗎?
我在Linux 2.6上編寫Perl。
而不是輪詢,看看你是否無法獲得文件描述符並進行select調用。
然後,一旦發生任何事情,您就可以控制回來,而不佔用CPU。
Web請求中的某處會有一些套接字,並且附加到套接字上的將是可用於select的文件描述符。
無論如何,你的程序可以在任何時間點被中斷任何時間量;如果這是一個真正的問題,你需要一個實時操作系統,但由於你正在處理網絡請求,我懷疑你需要這樣的響應水平。
事實上,你想要的是一個高層次的接口,爲你選擇呼叫。正如評論中所建議的那樣:http://search.cpan.org/dist/HTTP-Async/看起來像它會做你所需要的。
我不認爲在普通的Linux上可以保證睡眠時間。這幾乎是「實時」操作系統的重點,而普通的Linux不是「實時」。
我同意@Douglas Leeder:使用select調用來在內容發生變化時通知您。你也可以使用select調用來模擬亞秒鐘睡眠,但Time :: HiRes是一個更清潔的界面(並且你仍然不會避免等待)。
這聽起來像你真的想要一個事件循環。有 POE, EV和abstraction layers over both。
無論採用哪種方式,都不要自行實施。這個輪子已經發明瞭 。
這就是HTTP ::異步在底層所做的 - 看看代碼,看看它是如何完成的:http://search.cpan.org/dist/HTTP-Async/ – EvdB 2009-02-26 13:08:50