我有一个像这样的程序:
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
答案 0 :(得分:1)
您在这里至少有两个连接失败事件,并且两个事件都可能导致无法在未定义的时间内进行连接。这里的一个不错的选择是exponential backoff。
基本上,您尝试执行一项操作,检测出您知道需要重试的故障,然后等待。以后每次操作失败(在这种情况下,大概抛出异常),您都将等待先前等待时间的倍数。这个想法是,如果您受到速率的限制,您将等待越来越长的时间,直到要连接的API停止拒绝您的请求。另外,如果物理上已断开连接,则随着时间的流逝,您将尝试减少连接,而不是在无效的适配器上发送请求。
有一个Python库backoff
,可通过装饰器为您处理与此有关的大部分工作。