From 681a382eea63e8f415d4aa40c65d4db973f5cd0c Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 10 Aug 2018 12:25:52 -0700 Subject: [PATCH] added rateLimiter.py, by @felixhandte this rate limiter avoid the problem of `pv` which "catch up" after a blocked period instead of preserving a constant speed cap. --- tests/rateLimiter.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100755 tests/rateLimiter.py diff --git a/tests/rateLimiter.py b/tests/rateLimiter.py new file mode 100755 index 00000000..559f2275 --- /dev/null +++ b/tests/rateLimiter.py @@ -0,0 +1,33 @@ +#! /usr/bin/env python3 + +# ################################################################ +# Copyright (c) 2018-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under both the BSD-style license (found in the +# LICENSE file in the root directory of this source tree) and the GPLv2 (found +# in the COPYING file in the root directory of this source tree). +# ########################################################################## + +# Rate limiter, replacement for pv +# this rate limiter does not "catch up" after a blocking period +# Limitations: +# - only accepts limit speed in MB/s + +import sys +import time + +rate = float(sys.argv[1]) * 1024 * 1024 +start = time.time() +total_read = 0 + +buf = " " +while len(buf): + now = time.time() + to_read = max(int(rate * (now - start) - total_read), 1) + buf = sys.stdin.read(to_read) + write_start = time.time() + sys.stdout.write(buf) + write_end = time.time() + start += write_end - write_start + total_read += len(buf)