gpt4 book ai didi

Python 生成用于 S3 上传的 AWS CLI 进程,但它变得非常慢

转载 作者:太空宇宙 更新时间:2023-11-03 15:42:10 25 4
gpt4 key购买 nike

我的 Python 应用程序为 AWS CLI S3 上传创建一个子进程。

command = 'aws s3 sync /tmp/tmp_dir s3://mybucket/tmp_dir'
# spawn the process
sp = subprocess.Popen(
shlex.split(str(command)),
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# wait for a while
sp.wait()
out, err = sp.communicate()

if sp.returncode == 0:
logger.info("aws return code: %s", sp.returncode)
logger.info("aws cli stdout `{}`".format(out))
return

# handle error

/tmp/tmp_dir 大小约为 0.5Gb,包含约 100 个文件。上传过程大约需要 25 分钟,速度非常慢。

如果我直接运行 AWS 命令​​(不使用 Python),则需要不到 1 分钟。

怎么了?任何帮助表示赞赏。

最佳答案

我注意到文档中关于 wait() 使用的警告(见下文)。然而,与其调试它,为什么不重写它以使用 Python SDK,而不是使用 aws cli 进行 shell 操作呢?也许您会获得更好的性能和更清晰的代码。

https://boto3.readthedocs.io/en/latest/guide/s3.html

Warning This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

https://docs.python.org/2/library/subprocess.html

编辑3:

这是我刚刚测试过的解决方案,它运行时不会阻塞。有一些在底层使用 wait() 或 communications() 的便捷方法,它们更容易使用,例如 check_output:

#!/usr/bin/env python
import subprocess
from subprocess import CalledProcessError

command = ['aws','s3','sync','/tmp/test-sync','s3://bucket-name/test-sync']
try:
result = subprocess.check_output(command)
print(result)
except CalledProcessError as err:
# handle error, check err.returncode which is nonzero.
pass

关于Python 生成用于 S3 上传的 AWS CLI 进程,但它变得非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com