关于对容错的一点想法
最近收到一个任务,有N个数据,然后通过一个第三方的Web API对数据进行处理,并记录下处理的结果。初想起来,这个感觉很容易就能解决,比如用python写一个脚本,通过httplib库调用第三方的Web API,然后获取结果并记录。代码可能看起来像这样:
对于很少的数据量来说,我们可以忽略网络质量问题所导致的错误,但是当N非常大的时候呢?如果一个程序,跑了一段时间,结果在最后一秒钟因为网络问题崩溃了,你是什么心情?关于处理网络质量问题的解决方法很简单,就是重试。想想看,平时某个页面第一次打不开,你会做什么?单击刷新按钮吧?(这里不考虑你不想看这个页面的情况)如果刷新了好几次都没能打开,你可能就离开这个页面了——因为这个页面根本没法看。
把上面的情况放在程序里,代码多半会看起来像这样:
最后,如果处理的数据比较多,那么对结果进行记录的过程最好能在处理过程中逐步地记录,即使程序崩溃了,前面处理好的数据也会保存在结果文件中,这样就不会丢失之前已经处理过的结果了。当然,如果当程序出问题时,能告诉显示器面前的人程序已经处理到哪里了更好。
1
def getAPIResult(somedata):
2
conn = httplib.HTTPConnection('www.host.com')
3
conn.request('GET', '/path/?arg1=' + somedata + '&arg2=value2')
4
resp = conn.getresponse()
5
data = resp.read()
6
conn.close()
7
return processResultData(data)
现在的网络质量已经很好了,不过对于网络来说,发生超时错误或者是因为某种特殊原因而导致的请求失败还是有发生的可能的。因此,如果直接调用上面的getAPIResult函数其本身是不负责任的。也许你的程序会因为网络超时而崩溃。
2

3

4

5

6

7

对于很少的数据量来说,我们可以忽略网络质量问题所导致的错误,但是当N非常大的时候呢?如果一个程序,跑了一段时间,结果在最后一秒钟因为网络问题崩溃了,你是什么心情?关于处理网络质量问题的解决方法很简单,就是重试。想想看,平时某个页面第一次打不开,你会做什么?单击刷新按钮吧?(这里不考虑你不想看这个页面的情况)如果刷新了好几次都没能打开,你可能就离开这个页面了——因为这个页面根本没法看。
把上面的情况放在程序里,代码多半会看起来像这样:
1
def getAPIResultWithRetry(somedata):
2
for i in range(5):
3
try:
4
return getAPIResult(somedata)
5
except:
6
print "retry"
7
#The service must crashed!
这里用了上面的getAPIResult函数。这里我们就是捕获所有的异常,然后重试一次。不过总共重试5次,这样可以避免如果第三方的服务器当掉我们的程序还在傻傻地重试。当然,5次重试过后,你可能会有自己的想法,不过我个人觉得抛出一个异常可能更合适,毕竟第三方的服务器当掉的话,程序再怎么运行,结果也是不正确的。
2

3

4

5

6

7

最后,如果处理的数据比较多,那么对结果进行记录的过程最好能在处理过程中逐步地记录,即使程序崩溃了,前面处理好的数据也会保存在结果文件中,这样就不会丢失之前已经处理过的结果了。当然,如果当程序出问题时,能告诉显示器面前的人程序已经处理到哪里了更好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端