【问题标题】:Issue "Remote end closed connection without response" when create multiple sessions创建多个会话时发出“远程结束关闭连接而无响应”
【发布时间】:2018-12-19 16:55:00
【问题描述】:

这是我的情况:

当我使用 for 循环登录某个 REST-Web 站点大约 100 ~ 500 次时,如果我使用 requests.post 方法启动我的请求,请求框架就会发出标题为 Bug 的问题。代码如下:

# coding: UTF-8  
"""
@Author:    ITACHY
@CreateTime:2018/12/19 17:26
"""
import datetime
import uuid
import requests


def login_test(num):
    start = datetime.datetime.now()
    url = XXXXX
    uid = str(uuid.uuid4())
    body = {
        "type": "login",
        "clientinfo":
            {
                "deviceid": uid,
                "uid": uid,
                "timezone": "Asia/Shanghai",
                "osFamily": "ANDROID",
                "osVersion": "22",
                "deviceType": "MOBILE",
                "deviceModel": "1.0",
                "appVersion": "1.0.0-SNAPSHOT",
                "location":
                    {
                        "longitude": 116.407394,
                        "latitude": 39.904211,
                        "type": "GCJ02"
                    }
            }
    }
    header = {
        'Content-Type': 'application/json; charset=UTF-8',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }
    # response = requests.post(url, json = body, headers = header)
    response = requests.post(url, json = body, headers = header)
    if response.status_code == 200:
        result = response.json()
        print('Count: {}, Result: {}'.format(num, result))
        if result["code"] == 0:
            due = datetime.datetime.now() - start
            print('Count: {}, Uid: {}, Token: {}, Time; {}, '.format(str(i), uid, result["data"]["accessToken"], str(due)))
        else:
            due = datetime.datetime.now() - start
            print('Count: {}, Uid: {}, Response: {}, Time: {}, '.format(str(i), uid, result, str(due)))
    else:
        print('Count: {}, Login failed. Code: {}, Msg: {}'.format(num, response.status_code, response.text))


if __name__ == '__main__':

    for i in range(500):
        login_test(i)

但是当我将代码更改为以下内容时:

# coding: UTF-8
"""
@Author:    ITACHY
@CreateTime:2018/12/19 17:26
"""
import datetime
import uuid
import requests


# import logging


def login(count, session):
    start = datetime.datetime.now()
    url = XXXXXXX
    uid = str(uuid.uuid4())
    body = {
        "type": "login",
        "clientinfo":
            {
                "deviceid": uid,
                "uid": uid,
                "timezone": "Asia/Shanghai",
                "osFamily": "ANDROID",
                "osVersion": "22",
                "deviceType": "MOBILE",
                "deviceModel": "1.0",
                "appVersion": "1.0.0-SNAPSHOT",
                "location":
                    {
                        "longitude": 116.407394,
                        "latitude": 39.904211,
                        "type": "GCJ02"
                    }
            }
    }
    header = {
        'Content-Type': 'application/json; charset=UTF-8',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }
    # try:
    # response = requests.post(url, json = body, headers = header)
    response = session.post(url, json = body, headers = header)
    if response.status_code == 200:
        result = response.json()
        # print(result)
        if result["code"] == 0:
            due = datetime.datetime.now() - start
            print('Count: {}, Uid: {}, Token: {}, Time; {}, '.format(str(count), uid, result["data"]["accessToken"], str(due)))
        else:
            due = datetime.datetime.now() - start
            print('Count: {}, Uid: {}, Response: {}, Time: {}, '.format(str(count), uid, result, str(due)))
    else:
        print('Login failed. Code: {}, Msg: {}'.format(response.status_code, response.text))
    # except Exception as e:
    #     print(e)


if __name__ == '__main__':
    with requests.Session() as session:
        for i in range(5000):
            login(i, session)

一切顺利,我认为第二种方法只创建一个会话,第一种方法创建很多会话,请检查一下。如果有人可以确认,请提前感谢

【问题讨论】:

  • 顺便说一句:服务器在Apache NGINX后面,由Spring-Webflux REST-Style编写,容器是Undertow。

标签: python python-3.x python-requests


【解决方案1】:

如果你遇到这个问题,请在真实网站之前检查是否有NGINX代理,如果有,尝试直接连接网站,因为当前问题很多情况都是“代理”引起的;

【讨论】:

    【解决方案2】:

    当我抓取一些网页并使用requests.get 时,我遇到了同样的错误。 在我的代码中添加tryexcept 后,我的错误消失了。

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 2021-10-21
      • 2018-11-08
      • 2021-04-09
      • 2017-03-12
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多