我有一个从 Amazon S3 下载的脚本。这些脚本在 99.9% 的时间内都有效。有时我会收到以下错误(socket.error:[Errno 104] Connection reset by peer)。一旦我重新启动代码,错误似乎就消失了。因为很难重现错误。我希望下面的代码片段能够修复错误。具体来说,我希望如果出现错误,它会尝试重新下载文件。我想知道这段代码是否有效,是否还有其他我应该添加的东西。我认为错误计数器可能很好,所以如果错误确实不断出现,它最终会继续前进。 (不确定如何添加计数器)
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
最佳答案
我遇到了完全相同的问题。如果你在 GitHub 上搜索 boto,你会发现,我们并不孤单。
还有一个已知的已接受问题:https://github.com/boto/boto/issues/2207
达到 AWS S3 的性能极限
事实是,我们已经习惯了 boto 和 AWS S3 服务,我们忘记了,这些实际上是分布式系统,在某些情况下可能会崩溃。
我正在归档(下载、tar、上传)大量文件(大约 3 年,大约 15 个提要,每个提要每天大约有 1440 个版本)并使用 Celery 来更快地完成这项工作。我不得不说,有时我更频繁地遇到这些错误,可能达到了 AWS S3 的性能极限。这些错误通常成 block 出现(在我的例子中,我以大约 60 Mbps 的速度上传了几个小时)。
训练S3性能
当我测量性能时,它被“训练”了。几个小时后,S3 存储桶的响应速度跃升,AWS 可能检测到更高的负载并启动了更多实例来为其服务。
试试最新稳定版的boto
另一件事是,boto
在很多情况下都在尝试重试,所以很多失败都隐藏在我们的调用中。有时我升级到最新的稳定版本后会好一些。
我的结论是:
- 尝试升级到最新的稳定
boto
- 当错误率上升时,降低压力
- 接受这样一个事实,即 AWS S3 是具有罕见性能问题的分布式服务
在你的代码中,我肯定会建议添加一些 sleep ,(至少 5 秒,但 30 秒对我来说似乎很好),否则你只是越来越努力地插入一个系统,这可能在时刻。
关于python - 错误处理 : Boto: [Error 104] Connection Reset by Peer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23397460/