我需要一种非常便宜的方法来读取一个没有终止字符串(流)的缓冲区。这就是我所拥有的,但是它浪费了大量的CPU时间和精力。因为它一直在“尝试和捕捉”,我真的需要一种新的方法。
以下是我的代码的简化工作版本:

#! /usr/bin/env/ python
import fcntl, os, sys

if __name__ == "__main__":
    f = open("/dev/urandom", "r")
    fd = f.fileno()
    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)

    ready = False
    line = ""
    while True:
        try:
            char = f.read()
            if char == '\r':
                continue
            elif char = '\n':
                ready = True
            else:
                line += char
        except:
            continue
        if ready:
            print line

不要在终端运行这个。这只是为了说明问题。”“urandom”会破坏你的终端,因为它会吐出很多随机字符,终端模拟器会解释这些字符,不管是什么(这会改变你当前的外壳设置、标题等)。我在通过USB连接的GPS上阅读。
问题:如果可以的话,这将使用100%的CPU使用率。我尝试过:
#! /usr/bin/env/ python
import fcntl, os, sys

if __name__ == "__main__":
    f = open("/dev/urandom", "r")
    fd = f.fileno()
    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)

    for line in f.readlines():
        print line

但是,我得到了。我试过使用IOError: [Errno 11] Resource temporarily unavailable和其他东西。我不知所措。有人能提供一个解决方案吗(请解释一切,因为我本身不是专业人士)。另外,我应该注意到这是针对Unix的(特别是Linux,但是它必须在所有Linux版本中都是可移植的)。

最佳答案

您将希望将缓冲模式设置为打开文件流时要读取的块的大小。
从python文档:

io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)

“缓冲是用于设置缓冲策略的可选整数。传递0以关闭缓冲区(仅在二进制模式下允许),传递1以选择行缓冲区(仅在文本模式下可用),传递1以指示固定大小块缓冲区的大小。”
您还希望在while循环中使用readable()方法,以避免不必要的资源消耗。
但是,我建议您使用缓冲流,如io.BytesIOio.BufferedReader
docs中的更多信息。

关于python - Python读取流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26127889/

10-11 22:53
查看更多