首页 > 解决方案 > ConnectionResetError:[Errno 54] 对等方和其他 Errno 消息重置连接

问题描述

我有一个脚本,它通过多次调用过去成功运行的 API 来生成 CSV,但是现在我收到了 Errno 消息。最常见的是 [Errno 54] 对等方重置连接,[Errno 60] 操作超时,有时 [Errno 8] 提供节点名或服务名,或未知。

这个特定的脚本调用 API 大约 16-24k 次(我 100% 确定这低于速率限制),当它成功运行时大约需要 2-3 小时才能完成。出于某种原因,我似乎无法让它成功运行,而不会在脚本运行一段时间后出现某种错误。所以它会调用一个 API 路由数百/数千次,然后突然吐出一个错误,以调用它已经成功调用的同一个错误。似乎很奇怪。我也提供了下面的错误消息。

我已经删除了一些敏感信息,例如令牌和 API 路由,因为这是私有数据!不过,我已经保留了错误。


import http.client
import json
import csv



class mgrData:


    def __init__(self):

        self.token = '[REMOVED]'
        self.userDict = {}


    def getPeakData(self, route):

        conn = http.client.HTTPSConnection("[REMOVED]")
        bod = ''
        headers = {
          'Authorization': 'Bearer '+ str(self.token),
          'Content-Type': 'application/json'
        }
        conn.request("GET", route, bod, headers)

        res = conn.getresponse()
        data = res.read()

        return json.loads(data)




    def PeakExport(self):

        print("Please wait, data generating...")
        raw = self.getPeakData("[REMOVED]")
        totalrecords = raw['meta']['page']['total']
        resultspp = len(raw['data'])


        if totalrecords % resultspp == 0:
            numpages = int(totalrecords/resultspp)
        elif totalrecords % resultspp != 0:
            numpages = int(totalrecords//resultspp + 1)

        mainDct = {}
        for i in range(1,numpages+1):
            route = "[REMOVED]"
            dct = self.getPeakData(route)
            data = dct['data']


            for i in data:


                pkEmpID = i['attributes']['identifier'].split('_')[0]
                name = i['attributes']['name']

               # segID = i['id']

                hrisIDget = self.getPeakData("[REMOVED]")

                hrisID = hrisIDget['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['employeeNumber']

                if pkEmpID in mainDct:
                    if i['attributes']['direct'] == True:
                        dSegID = i['id']
                        mainDct[pkEmpID].append({'dSegID' : dSegID})


                    if i['attributes']['direct'] == False:
                        aSegID = i['id']
                        mainDct[pkEmpID].append({'aSegID' : aSegID})


                else:
                    mainDct.update({pkEmpID : []})
                    mainDct[pkEmpID].append({'name': name})
                    mainDct[pkEmpID].append({'EID' : hrisID})

                    if i['attributes']['direct'] == True:
                        dSegID = i['id']
                        mainDct[pkEmpID].append({'dSegID' : dSegID})


                    if i['attributes']['direct'] == False:
                        aSegID = i['id']
                        mainDct[pkEmpID].append({'aSegID' : aSegID})




        urllist = []
        for key in mainDct:
            switch = False
            for i in mainDct[key]:

                if 'aSegID' in i:
                    switch = True

                    data = self.getPeakData("[REMOVED]" % (i['aSegID']))

                    if 'mean' in data['data']['attributes']['scores']:
                        score = data['data']['attributes']['scores']['mean']
                        participation = data['data']['attributes']['participation']['mean']
                        nps = data['data']['attributes']['scores']['nps']['score']

                        mainDct[key].append({'engagement all': score})
                        mainDct[key].append({'nps all': nps})
                        mainDct[key].append({'participation all' : participation})

                    elif 'anonymity' in data['data']['attributes']['scores']:
                        mainDct[key].append({'engagement all':'Anonymity'})
                        mainDct[key].append({'nps all': 'Anonymity'})
                        mainDct[key].append({'participation all': 'Anonymity'})


                    else:
                        mainDct[key].append({'engagement all': 'N/A'})
                        mainDct[key].append({'nps all':'N/A'})
                        mainDct[key].append({'participation all': 'N/A'})

            if switch == False:
                mainDct[key].append({'aSegID' : 'None'})
                mainDct[key].append({'engagement all' :'N/A'})
                mainDct[key].append({'nps all': 'N/A'})
                mainDct[key].append({'participation all: N/A'})

        for key in mainDct:
            switch = False
            for i in mainDct[key]:
                if 'dSegID' in i:
                    switch = True

                    data = self.getPeakData("[REMOVED]" % (i['dSegID']))

                    if 'mean' in data['data']['attributes']['scores']:
                        score = data['data']['attributes']['scores']['mean']
                        participation = data['data']['attributes']['participation']['mean']
                        nps = data['data']['attributes']['scores']['nps']['score']


                        mainDct[key].append({'engagement direct': score})
                        mainDct[key].append({'nps direct': nps})
                        mainDct[key].append({'participation direct': participation})

                    elif 'anonymity' in data['data']['attributes']['scores']:
                        mainDct[key].append({'engagement direct': 'Anonymity'})
                        mainDct[key].append({'nps direct': 'Anonymity'})
                        mainDct[key].append({'participation direct': 'Anonymity'})

                    else:
                        mainDct[key].append({'engagement direct': 'N/A'})
                        mainDct[key].append({'nps direct': 'N/A'})
                        mainDct[key].append({'participation direct': 'N/A'}) 

            if switch == False:
                mainDct[key].append({'dSegID' : 'None'}) 
                mainDct[key].append({'engagement direct': 'N/A'})
                mainDct[key].append({'nps direct': 'N/A'})
                mainDct[key].append({'participation direct': 'N/A'})                                    




        with open('Output.csv', 'w') as csv_file:
            csvwriter = csv.writer(csv_file, delimiter=',')
            csvwriter.writerow(['Manager ID', 'Manager Name','Direct Engagement', 'All Engagement', 'Direct NPS', 'All NPS', 'Direct Participation', 'All Participation'])
            for key in mainDct:
                for i in mainDct[key]:
                    if 'name' in i:
                        name = i['name']
                    if 'EID' in i:
                        EID = i['EID']
                    if 'nps direct' in i:
                        ND = i['nps direct']
                    if 'engagement direct' in i:
                        ED = i['engagement direct']
                    if 'participation direct' in i:
                        PD = i['participation direct']
                    if 'engagement all' in i:
                        EA = i['engagement all']
                    if 'nps all' in i:
                        NA = i['nps all']
                    if 'participation all' in i:
                        PA = i['participation all']

                csvwriter.writerow([EID,name,ED,EA,ND,NA,PD,PA])


def main():
    thisSync = mgrData()
    thisSync.PeakExport()




main()

我收到的一些错误:

Please wait, data generating...
Traceback (most recent call last):
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 209, in <module>
    main()
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 204, in main
    thisSync.PeakExport()
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 72, in PeakExport
    hrisIDget = self.getPeakData("/scim/v2/users/employee_"+str(pkEmpID))
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 31, in getPeakData
    res = conn.getresponse()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 1332, in getresponse
    response.begin()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 303, in begin
    version, status, reason = self._read_status()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 264, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", line 669, in readinto
    return self._sock.recv_into(b)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", line 1241, in recv_into
    return self.read(nbytes, buffer)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", line 1099, in read
    return self._sslobj.read(len, buffer)
ConnectionResetError: [Errno 54] Connection reset by peer
[Finished in 1263.8s with exit code 1]
[cmd: ['/Library/Frameworks/Python.framework/Versions/3.8/bin/python3', '-u', '/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py']]
[dir: /Volumes/GoogleDrive/My Drive/BI Scripts]
[path: /Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin]
Please wait, data generating...
Traceback (most recent call last):
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 209, in <module>
    main()
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 204, in main
    thisSync.PeakExport()
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 72, in PeakExport
    hrisIDget = self.getPeakData("/scim/v2/users/employee_"+str(pkEmpID))
  File "/Volumes/GoogleDrive/My Drive/BI Scripts/Random.py", line 31, in getPeakData
    res = conn.getresponse()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 1332, in getresponse
    response.begin()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 303, in begin
    version, status, reason = self._read_status()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 264, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", line 669, in readinto
    return self._sock.recv_into(b)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", line 1241, in recv_into
    return self.read(nbytes, buffer)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", line 1099, in read
    return self._sslobj.read(len, buffer)
TimeoutError: [Errno 60] Operation timed out

标签: pythonpython-3.x

解决方案


推荐阅读