2011-07-01 26 views
5

我嘗試創建一個對多個站點執行查詢的Python腳本。該腳本運行良好(我使用urllib2),但僅用於一個鏈接。對於多個網站,我一個接一個地發出多個請求,但它不是很強大。Python:並行運行多個查詢並獲得第一個完成

什麼是理想的解決方案(線程我猜)並行運行多個查詢和停止別人查詢時返回一個特定的字符串?

我發現這個問題,但我還沒有找到如何改變其停止剩餘線程...: Python urllib2.urlopen() is slow, need a better way to read several urls

預先感謝您!

(抱歉,如果我的英文犯過錯誤,我是法國人^^)

回答

0

這通常與以下模式(對不起,我的Python技能不是那麼好)來實現。

您有一個名爲Runner的類。這個班有很長的跑步方法,可以獲得你需要的信息。另外,它有一個Cancel方法,它以某種方式中斷了長時間運行的方法(你可以使url請求對象成爲一個類成員字段,所以cancel類調用request.terminate()的等價物)。

長時間運行的方法需要接受回調函數,該函數在完成時發出信號。

然後,在開始多個線程之前,您將創建該類的所有這些對象的實例,並將它們保存在一個列表中。在同一個循環中,您可以啓動這些長時間運行的方法,傳遞主程序的回調方法。

而且,在回調方法中,您只需遍歷所有線程類的列表並調用它們的cancel方法。

請編輯我的回答與任何Python的具體實施:)

0

你可以用multiprocessing庫,民調結果運行查詢,並關閉查詢您不再需要。該模塊的Documentation包括具有terminate()方法的Process類的信息。如果您希望限制發送的請求數量,請查看池的選項。

2

您可以使用Twisted同時處理多個請求。在內部它將使用epoll(或iocp或kqueue,取決於平臺)高效地獲得TCP可用性的通知,這比使用線程便宜。一旦有一個請求匹配,你就可以cancel其他。

Here is the Twisted http agent tutorial

相關問題