在python中如何挂起httppost请求?

2024-09-25 00:36:30 发布

您现在位置:Python中文网/ 问答频道 /正文

样本代码:

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()

我不认为上面的代码有什么问题,但偶尔我会挂起httppost请求,这会阻止整个脚本继续运行。我已经用了socket.setdefaulttimeout(150)怎么不起作用了?造成这个问题的原因是什么?我该怎么做才能摆脱这个?在


Tags: 代码browserurldataresponserequestwindowssocket
3条回答

可能有很多原因-你发布到的服务器可能很忙,网络拥塞,等等

但是,您可以通过确保发送完整的头(缺少Content-type头)来消除问题。在

我想是因为你没有设置内容长度标题。如果一个请求被发布到服务器,数据将在请求的主体中提交。由于tcp连接基于流的特性,服务器无法找到请求的长度,除非您在头中明确地告诉它。在不知道请求何时结束的情况下,服务器必须无限期地等待。在

timeout属性在这里不起作用,因为您的套接字在任何recv/send操作中都没有被阻塞。您已经完成了通过socket写入数据,但服务器认为您还有更多要发送的内容。在

发现了问题。在

我最近一直在使用requests,并意识到在mechanize和{}中设置的timeout是{a1},这意味着如果连接非常慢并且仍有数据传输,则不会超时,这可能会使连接挂起相当长的时间。在

所以我所做的就是用线程包装这些请求,并为这些线程设置超时,这样超时就更准确了,只需确保清理/垃圾收集那些挂起的连接。在

相关问题 更多 >