我有一个从Amazon S3下载的脚本。这些脚本的工作时间为99.9%。偶尔我收到以下错误(socket.error:[Errno 104]连接由同行重置)。一旦我重新启动代码,错误似乎就消失了。由于很难重现错误。我希望下面的代码剪切将修复错误。具体来说,我希望如果出现错误,它会尝试重新下载该文件。我想知道这段代码是否有用,以及是否还有其他内容我应该加入。我认为错误计数器可能是好的,所以如果错误确实不断出现,那么最终继续。 (不完全确定如何添加计数器)
files = [#list of files to download]
for file in files:
for keys in bucket.list(prefix=file):
while True:
try:
keys.get_contents_to_filename()
except socket.error:
continue
break
答案 0 :(得分:5)
我有完全相同的问题。如果你在GitHub上搜索boto,你会发现,我们并不孤单。
还有一个已知的已接受问题:https://github.com/boto/boto/issues/2207
事实是,我们已经习惯了boto和AWS S3服务,我们已经忘记了,这些是真正的分布式系统,在某些情况下可能会破坏。
我正在归档(下载,tar,上传)大量文件(大约3年,大约15个Feed,每个大约每天有1440个版本),并使用Celery更快地完成此操作。我不得不说,我有时会更频繁地收到这些错误,可能达到了AWS S3的性能限制。这些错误通常出现在块中(在我的情况下,我上传大约60 Mbps几个小时)。
当我测量表现时,它被“训练”了。一段时间后,S3桶的响应速度上升,AWS可能检测到更高的负载并启动更多服务器实例。
boto
另一方面,boto
试图在很多情况下重试,因此我们的呼叫隐藏了很多失败。有时我升级到最新的稳定版本会有所改善。
boto
在你的代码中,我肯定会建议添加一些睡眠,(至少5,但30秒对我来说似乎没问题),否则你只是越来越难以推进系统,这可能是在一个不稳定的情况下时刻。
答案 1 :(得分:1)
好吧,看来time.sleep()工作了一段时间。但是,既然文件更大,那甚至都不行。好像我需要重新启动循环才能让它再次运行。这种修改似乎有效。
def download(filesToDownload):
temp = []
for sFile in filesToDownload:
for keys in bucket.list(prefix='<bucket>%s' % (sFile)):
while True:
try:
keys.get_contents_to_filename('%s%s' % (downloadRoot,sFile))
temp.append(sFile)
except:
time.sleep(30)
x = set(filesToDownload) - set(temp)
download(x)
break
答案 2 :(得分:0)
我遇到了这个问题,修复了什么是创建新的访问密钥,因为旧的访问密钥被破坏了