2012-08-16 37 views
0

我使用urllib2與代理髮送數千請求。我收到了以下錯誤對執行:Python urllib2:無法分配請求的地址

urlopen error [Errno 99] Cannot assign requested address 

我讀here,這可能是由於已經被粘合的插座。是這樣嗎?對於如何解決這個問題,有任何的建議嗎?

+4

你能否提供你正在使用的確切代碼,包括當它失敗的全回溯? – 2012-08-16 06:53:56

+1

你的問題看起來類似於這個http://stackoverflow.com/questions/11190595/repeated-post-request-is-causing-error-socket-error-99-cannot-assign-reques – 2012-08-16 07:24:35

回答

4

這裏有一個問題的答案我提前準備的....更早一個容貌相似的問題... Socket in use error when reusing sockets

的錯誤是不同的,但潛在的問題很可能是相同的:你是消費的所有可用端口並在TIME_WAIT狀態結束之前嘗試重用它們。

[編輯:在迴應評論]

如果您的應用程序的能力/規格中,一個顯而易見的策略是控制連接的速率,以避免這種情況。可以使用httplib模塊。 httplib.HTTPConnection()可讓您指定一個source_address元組,您可以使用該元組指定建立連接的端口,例如從本地主機1234:9999:這會連接到本地主機

import httplib 
conn = httplib.HTTPConnection('localhost:1234', source_address=('localhost',9999)) 
conn.request('GET', '/index.html') 

然後,它是我在剛纔的答覆中所述管理源端口分配的問題。如果您在Windows上,則可以使用此方法來避開端口1024-5000的默認範圍。

當然,您將能夠創建多少個連接的上限是存在的,並且值得懷疑的是,什麼樣的應用程序需要快速連續地創建數千個連接。

+0

謝謝,這解釋了很多。如你所說,錯誤是不一樣的。我實際上並沒有在我的應用程序中使用套接字庫。我爲許多異步連接使用urllib2和gevent。你知道如何使用這些庫而不是套接字庫來實現這個解決方案嗎? – 2012-08-16 13:56:48

+0

@AustinK:回答用建議的策略更新。 – mhawke 2012-08-17 04:12:13

1

由於mhawke建議,TIME_WAIT的問題似乎最有可能。系統範圍內的修復可以調整內核參數,以便更頻繁地清理這些連接。兩個選項:

$ sysctl net.ipv4.tcp_tw_recycle=1 

這會讓內核在TIME_WAIT狀態中重用連接。這可能會導致NAT設置問題。另一條是:

$ sysctl net.ipv4.tcp_max_orphans=8192 
$ sysctl net.ipv4.tcp_orphan_retries=1 

這告訴內核,以保持在不附加任何用戶進程最8192連接,並能查殺TCP連接之前重試一次。

請注意,這些並非永久性更改。將設置添加到/etc/sysctl.conf以使它們永久。

http://code.google.com/p/lusca-cache/issues/detail?id=89#c4
http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.obscure.html

相關問題