Мне нужен очень недорогой способ чтения буфера без завершающей строки (потока) в Python. Это то, что у меня есть, но он тратит много на время и усилия процессора. Потому что он постоянно "пытается и ловить". Мне действительно нужен новый подход.
Ниже приведена сокращенная рабочая версия моего кода:
#! /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" сломает ваш терминал, потому что он выплескивает множество случайных символов, которые интерпретирует эмулятор терминала независимо от того, что (что может изменить текущие настройки оболочки, название и т.д.). Я читал из gps, подключенного через usb.
Проблема: это использует 100% использования ЦП, когда это возможно. Я пробовал это:
#! /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).