【发布时间】:2014-11-25 11:57:22
【问题描述】:
我需要一种非常廉价的方式来读取 Python 中没有终止字符串(流)的缓冲区。这就是我所拥有的,但它浪费了 大量 的 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”会破坏你的终端,因为它会吐出很多终端模拟器无论如何都会解释的随机字符(这可以改变你当前的 shell 设置、标题等)。我正在从通过 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。我曾尝试使用Popen。我很茫然。有人可以提供解决方案(并请解释一切,因为我本身不是专业人士)。另外,我应该注意,这是针对 Unix(尤其是 Linux,但它必须在所有版本的 Linux 上都可移植)。
【问题讨论】:
-
哇!我真的只是发现了它……虽然是 Python 2.6 的新手……docs.python.org/2/library/io.html
-
不过,您需要使用无缓冲模式。
-
我认为它对你有用; ` io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)`
-
为了清楚起见,您真的想读取 urandom 还是普通文件或管道的替代品?
-
@tdelaney 不!我正在尝试从 /dev/ttyUSB0 读取 gps puck。它隐藏在第二段的最后一句中。
标签: python filestream