【问题标题】:What should I do with hanging http POST request in python?在 python 中挂起 http POST 请求应该怎么做?
【发布时间】:2012-01-17 07:46:42
【问题描述】:

示例代码:

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) 怎么没用?造成这个问题的原因是什么?我应该怎么做才能摆脱它?

【问题讨论】:

    标签: python http urllib2 mechanize urllib


    【解决方案1】:

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

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

    【讨论】:

    • 您介意提供更多详细信息吗?如果只添加 Content-type 标头会有什么不同?我的意思是,socket.setdefaulttimeout(150) 至少应该在超时后关闭挂起的连接,不是吗?如果它不起作用,有没有更好的解决挂起请求的解决方案?
    【解决方案2】:

    我认为这是因为您没有设置 content-length 标头。如果将请求发布到服务器,则数据将在请求的正文中提交。由于 tcp connection 的基于流的特性,服务器无法找出请求的长度,除非您在标头中明确告诉它。在不知道您的请求何时结束的情况下,服务器必须无限期地等待。

    并且超时属性在这里不起作用,因为您的套接字在任何接收/发送操作上都没有被阻塞。您已经通过套接字完成了数据写入,但服务器认为您还有更多要发送。

    【讨论】:

      【解决方案3】:

      发现问题。

      我最近一直在使用requests,发现你在mechanizerequests中设置的timeout"NOT a time limit on the entire response download",这意味着如果连接真的很慢并且还有数据传输,它不会超时,这可能会挂起很长时间的连接。

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

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多