我正在使用boto上传和下载文件到S3&冰川。
如何限制/限制上传和下载速度?
答案 0 :(得分:2)
免责声明:我经常使用boto for S3,并且还有使用Amazon Glacier的经验。我还查看了当前版本的boto并快速检查了源代码以获得当前的知识,但是有一点点机会,我可能是错的。
这可以用于S3下载,因为这些方法允许设置这样的处理程序。
你必须自己编写这样的处理程序。
cb
参数和#34;位阻塞"行为上传和下载S3对象的功能提供参数cb
,您可以在其中定义在上传/下载一定数量的数据后重复调用的函数。
理论上,可以创建这样一个可调用的,可以记录自上次调用以来的时间和数据量,并等待一段时间来限制速度。
我没有为Amazon Glacier找到类似的选项。
答案 1 :(得分:0)
最简单的方法是在linux下使用流量整形工具,比如tc。这些工具可让您控制带宽甚至模拟网络数据包丢失甚至长途通信问题。易于编写python脚本以通过shell控制端口行为。
答案 2 :(得分:0)
我已经为s3 boto python库实现了一个速率限制进度类,如下所示:假设您的每秒速率高于该速率限制,并且似乎可以正常工作。
class ProgressPercentage(object):
def __init__(self, rate_limit=-1):
self._seen_so_far = 0
self.rate_limit = rate_limit
self.bytes_check = 0
self._lock = threading.Lock()
self.check_time = datetime.datetime.now()
def __call__(self, bytes_amount):
with self._lock:
self._seen_so_far += bytes_amount
if self.rate_limit > 0:
# assumes one thread
self.bytes_check += bytes_amount
elapsed_time = datetime.datetime.now() - self.check_time
total_seconds = elapsed_time.total_seconds()
if self.bytes_check > self.rate_limit:
if total_seconds < 1:
time.sleep(1.0 - total_seconds)
self.bytes_check = 0
self.check_time = datetime.datetime.now()
if sys.stderr.isatty():
sys.stderr.write(
"\r{0}".format(size_str(self._seen_so_far)))
sys.stderr.flush()
如本例中所示,呼叫限制为每秒100k:
s3_client.upload_file(file_name, bucket_name, key, Callback=ProgressPercentage(100000))