示例代码:
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 :(得分:0)
可能有很多原因 - 您要发布的服务器可能很忙,网络拥塞等等。
但是,您可以通过确保发送完整标题(缺少Content-type
标题)来消除问题。
答案 1 :(得分:0)
我认为这是因为你没有设置内容长度标题。如果请求发布到服务器,则数据将在请求的正文中提交。由于tcp连接的基于流的特性,服务器无法找出请求的长度,除非你在头文件中明确告诉它。在不知道您的请求何时结束的情况下,服务器必须无限期地等待。
并且timeout属性在这里不起作用,因为在任何recv / send操作中都没有阻止套接字。你已经完成了通过套接字写入数据,但服务器认为你还有更多要发送的数据。
答案 2 :(得分:0)
发现问题。
我最近一直在使用requests
并且意识到您在timeout
和mechanize
中设置的requests
都是"NOT a time limit on the entire response download",意味着如果连接真的很慢并且仍有数据传输,它将不会超时,这可能会使连接挂起很长时间。
所以我所做的就是用线程包装这些请求并为这些线程设置超时,这样超时更准确,只需确保清理/垃圾收集那些挂起的连接。