2013-06-24 32 views
1

我有一個要求,我需要每分鐘擊中2000個URL並將響應保存到數據庫。 URL需要在每分鐘開始的5秒鐘內點擊(但響應可以等待)。然後,在下一分鐘,同樣會發生,等等。所以,時間緊迫。同時擊中URLS和處理結果

我試過使用Python多處理和線程來解決這個問題。但是,某些網址可能需要長達30分鐘才能響應,這會阻止處理所有其他網址。

我也開放使用C這樣的低級別,但不知道從哪裏開始。

任何正確的方向指導將有所幫助,謝謝。

回答

1

您需要比線程更輕的東西,因爲如果每個URL都可能阻塞很長時間,那麼您需要同時發送它們,而不是通過線程池。

gevent是一個圍繞eventlib循環的Python包裝,它很擅長這類事情。從自己的文件:

>>> import gevent 
>>> from gevent import socket 
>>> urls = ['www.google.com', 'www.example.com', 'www.python.org'] 
>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls] 
>>> gevent.joinall(jobs, timeout=2) 
>>> [job.value for job in jobs] 
['74.125.79.106', '208.77.188.166', '82.94.164.162'] 
+0

謝謝,我只是嘗試了GEVENT,它似乎適合我的使用情況。我假設這個「猴子補丁」的東西應該修補mysql連接,我也會試試。我還發現了一個幫助我的資源:http://sdiehl.github.io/gevent-tutorial/ – nonocat

0

我不知道如果我理解正確的問題,但如果你使用的是「N」的過程,如果所有的「N」他們的卡住的響應,則更改語言將無法解決您的問題。由於瓶頸是您請求的服務器,而不是您的本地驅動程序代碼。您可以通過切換到異步機制來消除此依賴性。不要等待迴應!讓回調爲你處理它!

編輯:你可能想看看https://github.com/kennethreitz/grequests

+0

我聽說過請求之前,但不知道這個庫我會看看謝謝。 – nonocat

+0

它實際上在內部使用gevent! –