Python“请求” GET循环最终抛出[WinError 10048]

时间:2018-08-09 18:59:54

标签: python python-requests

免责声明:这与与此错误相关的其他一些问题类似,但是我的程序未使用任何多线程/处理,并且我使用的是“请求”模块而不是原始套接字命令,因此我没有解决方案看到与我的问题有关。

我有一个基本的状态检查程序,该程序在Windows上运行Python 3.4,该程序使用GET请求从一些必须由我监视的服务器托管的状态站点中提取一些数据。核心代码是这样设置的:

import requests
import time

URL_LIST = [some, list, of, the, status, sites]    # https:// sites
session = requests.session()

previous_data = ""
while 1:
    data = ""
    for url in URL_LIST:
        headers = {'X-Auth-Token': Associated_Auth_Token}
        try:
            status = session.get(url, headers=headers).json()['status']
        except ConnectionError:
            status = "SERVER DOWN"
        data += "%s \t%s\n" % (url, status)
    if data != previous_data:
        print(data)
        previous_data = data
    time.sleep(15)

...通常可以正常运行几个小时(此脚本旨在24/7运行,并内置了其他日志记录,为简单起见和相关性,此处省略了),但最终它崩溃并抛出标题中提到的错误:

[WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

众所周知,我请求的服务器有时很慢(有时会完全崩溃,因此尝试/除外),所以我倾向于这样一遍又一遍地循环,最终一个请求在下一个请求之前没有完全完成。请求通过,Windows尝试自行执行,但是我看不到代码会如何发生,因为它是通过URL依次进行迭代的。

另外,如果这是其他一些相关帖子遇到的TIME_WAIT问题,我宁愿不必等待它完成,因为我想每15秒或更长时间更新一次,因此我考虑关闭并经常打开一个新的请求会话,因为它通常在遇到障碍之前可以正常工作几个小时,但是基于卢卡萨的评论here

  

为避免在TIME_WAIT中获取套接字,最好的办法是在尽可能高的范围内使用单个Session对象,并在程序的整个生命周期内保持打开状态。请求将尽最大努力尽可能地重用套接字,这应防止它们陷入TIME_WAIT

...听起来似乎不是一个好主意-尽管当他说“程序的生命周期”时,他可能不打算像我的情况那样将该声明包括24/7使用。

因此,与其一味地尝试并等待几个小时让程序再次崩溃,以便我可以查看错误是否发生变化,不如我想在这里先参考大量的知识,看看是否有人可以看到问题所在,然后知道我应该如何解决。

谢谢!

0 个答案:

没有答案