首页 > 解决方案 > 互联网断开重新连接后如何继续我的程序?

问题描述

我有一个这样的程序:

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

标签: pythonrequestconnection

解决方案


您在这里至少有两个连接失败事件,其中任何一个都可能导致无法在未定义的时间内连接。这里一个不错的选择是指数退避

基本上,您尝试操作,检测您知道需要重试的故障,然后等待。每次后续操作失败(在这种情况下,可能会引发异常),您等待前一个等待时间的倍数。这个想法是,如果您受到速率限制,您将等待越来越长的时间,直到您连接的 API 停止拒绝您的请求。此外,如果您已经物理断开连接,随着时间的推移,您将尝试更少的连接,而不是在死适配器上发送垃圾邮件请求。

有一个 Python 库,backoff它使用装饰器为您处理其中涉及的大部分工作。


推荐阅读