Python:stdout率是应该的两倍

时间:2017-06-02 07:18:07

标签: python python-2.7 stdout flush rate

我在python 2.7中编写了一个非常简单的脚本,名为slowcat.py,它允许我cat一个每秒具有特定字节速率的文件。现在的问题是,给定的速率在输出流上加倍。因此,速率= 1字节导致每秒2个字节,速率= 4个字节导致每秒8个字节。请参阅实际程序的代码段:

#!/usr/bin/env python

import argparse
import time
import sys
import os


def get_configuration():
    """
    Returns a populated configuration
    """
    parser = argparse.ArgumentParser()
    parser.add_argument('file', metavar='FILE', type=argparse.FileType('r'),
                        nargs='?', help="Input file")
    parser.add_argument('--rate', type=int, default=666880,
                        help="Output rate in bytes per second")

    return parser.parse_args()


def main():
    cfg = get_configuration()

    size = os.path.getsize(cfg.file.name)
    bytes_read = 0

    t1 = time.time()
    while True:
        n = min(cfg.rate, size-bytes_read)
        if n <= 0:
            break
        buf = cfg.file.read(n)
        sys.stdout.write(buf)
        sys.stdout.flush()
        bytes_read += n
        t2 = time.time()
        if t2-t1 < 1.0:
            time.sleep(1.0 - (t2-t1))
        t1 = t2


if __name__ == "__main__":
    main()

现在我的问题是:为什么输出速率是我在命令行上传递的两倍?如果您复制粘贴代码段,您可以轻松地在系统上试用它,例如python slowcat.py --rate 2 slowcat.py

1 个答案:

答案 0 :(得分:2)

问题是t1 = t2循环结束时的while。这会将t1设置为 sleep延迟之前的时间,因此下次测试经过的时间间隔时,它将超过1秒,因此{{1将跳过调用。

要解决此问题,请将最后一行更改为

sleep
顺便说一下,使用新的time.perf_counter()而不是time.time()

可能更准确