2011-12-10 136 views
0

示例代碼:我應該如何處理在python中掛起http POST請求?

socket.setdefaulttimeout(150) 

MechBrowser = mechanize.Browser() 
Header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729)'} 
Url = "http://example.com" 
Data = "Justatest=whatever&letstry=doit" 
Request = urllib2.Request(Url, Data, Header) 
Response = MechBrowser.open(Request) 
Response.close() 

我不認爲有什麼不妥上面的代碼,但它可以防止整個腳本從連續運行的每一個現在,那麼,我把掛HTTP POST請求。我已經使用socket.setdefaulttimeout(150)它怎麼不起作用?造成這個問題的原因是什麼?我該怎麼做才能擺脫這個?

回答

0

發現問題。

我一直在使用requests很多最近並意識到timeout你在這兩個mechanize設置和requests"NOT a time limit on the entire response download",這意味着如果連接是非常緩慢的,還有數據傳輸,也不會超時,這可能掛斷連接很長一段時間。

因此,我所做的就是用線程包裝這些請求併爲這些線程設置超時時間,這樣超時更準確,只要確保清理/垃圾收集那些掛起的連接即可。

0

可能有很多原因 - 您發佈到服務器可能是忙,網絡擁塞等

但是,您可以通過確保消除您的最終問題,您發送完整的報頭(你缺少Content-type頭)。

+1

你介意提供更多細節嗎?如果僅添加了「Content-type」頭部,它會有什麼不同?我的意思是,'socket.setdefaulttimeout(150)'應該至少關閉掛起的連接,一旦它超時,不是嗎?如果它不起作用,還有更好的解決方案來結束掛起請求? – Shane

0

我認爲這是因爲你沒有設置內容長度標題。如果請求發佈到服務器,則數據將在請求的正文中提交。由於tcp連接基於流的特性,服務器無法找出請求的長度,除非您在頭文件中明確指出。不知道你的請求何時結束,服務器必須無限期地等待。

並且timeout屬性在此處不起作用,因爲您的套接字在任何recv/send操作中都未被阻止。你已經通過套接字寫了數據,但服務器認爲你有更多的發送。