互联网断开连接后,如何继续我的程序?

时间:2019-06-23 18:01:35

标签: python request connection

我有一个像这样的程序:

for i in range(25200):

    time.sleep(1)
    with requests.Session() as s:
               data = {'ContractCode' : 'SAFMO98' }
               r = s.post('http://cdn.ime.co.ir/Services/Fut_Live_Loc_Service.asmx/GetContractInfo', json = data ).json()

    for key, value in r.items():
        plt.clf()
        last_prices = (r[key]['LastTradedPrice'])   
        z.append(last_prices)
        plt.figure(1)
        plt.plot(z)

有时服务器拒绝连接并给出Exceeds request消息。或者有时候我失去了联系,等等。

然后,我必须重新运行我的程序,然后我将松开绘制的图形,以及程序断开连接的时间以及这段时间内丢失的数据。因此,我想做的是在程序中添加一些内容,以防止连接中断或中断。我的意思是我的程序在失去连接或被服务器端拒绝时不会停止,并且在再次连接时将保持工作。

怎么可能?

编辑:我像下面那样编辑了代码,但不知道这种方法有多好?

    try:
       for i in range(25200):

           time.sleep(1)
           with requests.Session() as s:
                      data = {'ContractCode' : 'SAFMO98' }
                      r =s.post('http://cdn.ime.co.ir/Services/Fut_Live_Loc_Service.asmx/GetContractInfo', json = data ).json()

           for key, value in r.items():
               plt.clf()
               last_prices = (r[key]['LastTradedPrice'])   
               z.append(last_prices)
               plt.figure(1)
               plt.plot(z)

    except:
        pass

1 个答案:

答案 0 :(得分:1)

您在这里至少有两个连接失败事件,并且两个事件都可能导致无法在未定义的时间内进行连接。这里的一个不错的选择是exponential backoff

基本上,您尝试执行一项操作,检测出您知道需要重试的故障,然后等待。以后每次操作失败(在这种情况下,大概抛出异常),您都将等待先前等待时间的倍数。这个想法是,如果您受到速率的限制,您将等待越来越长的时间,直到要连接的API停止拒绝您的请求。另外,如果物理上已断开连接,则随着时间的流逝,您将尝试减少连接,而不是在无效的适配器上发送请求。

有一个Python库backoff,可通过装饰器为您处理与此有关的大部分工作。