我需要一种非常便宜的方法来读取一个没有终止字符串(流)的缓冲区。这就是我所拥有的,但是它浪费了大量的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.BytesIO
或io.BufferedReader
docs中的更多信息。
关于python - Python读取流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26127889/