Python sys.stdin.read (max) блокирует до тех пор, пока не будет прочитано max (если max> = 0), блокирует до EOF, но select указывает, что есть данные для чтения
Моя проблема:
select
указывает, что есть данные для чтения, я хочу прочитать все, что есть, я не хочу ждатьmax
сумма присутствовать. еслиmax
<= 0, тогда чтение ждет, пока не встретится EOF, если>max
0 читать блоки доmax
байты могут быть прочитаны.
Я нене хочу этого, я хочу прочитать любую сумму, сделанную, выберите положить в "готов к чтению список. читать (1)Это практично, потому что это потребует МНОЖЕСТВА вызовов для чтения. НО это не должнот блок.
Есть ли способ узнать количество, присутствующее в буфере при возврате select (если он возвращает, указывая, что что-то может быть прочитано, а не по тайм-ауту) и прочитать это количество? Есть ли способ использоватьmax
как бы с розетками? Где он читает столько, сколько может мгновенно, потом возвращается?
Решением может быть перевод файла в неблокирующий режим для чтения? Я'я не уверен, я нене ожидал этогодо конца поведение.
Я буду продолжать читать и пытаться, но ямы просто провели 30 минут или около того и не стали ближе, этоВот почему я обращаюсь к вам.
НОТА
Есть много вопросов, спрашивающих, как заставить recv ждать количество ввода и блокировать вещи, пока не достигнет этого максимума.не ищу это. Моя проблема этоявляется блокировка.
добавление
setblocking(False)
А не было»я не работаюТеперь я читаю о том, как сделать его неблокирующим на время чтения. Я надеюсь на документацию:
stdin.read Found at: sys
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was
requested
may be returned, even if no size parameter was given.
Приложение II
Кажется, что read (0) на самом деле читает 0, это ничто, это приводит к бесконечному циклу, что интересно!
мне жаль, что я нена самом деле попробовать 0 кажется, я начал с 4096 (думая, чтоБуду читать все, что есть ....) пытался без параметров, но не с 0.
Интересно, что будет использовать read (0)?
Приложение IIII '
У меня сейчас проблемы с выбором (ямы пытались принять чтение (1) в качестве решения) Здесь 'Фактический код:
def getInput(self):
log.log(log.INFO,"GetInput","Select")
readsReady = select.select((sys.stdin,),(),(),1)[0]
if len(readsReady) == 0:
#timed out
log.log(log.INFO,"GetInput","Select timed out")
if not self.toClose:
self.handler.post("GetInput")
else:
threads.getCurrentThread().removeAllHandlers()
else:
#OPTIMISED FOR READING 1
#log.log(log.INFO,"GetInput","Reading")
data = sys.stdin.read(1)
log.log(log.INFO,"GetInput","Read: "+data)
if data == "\n":
self.onInputHandler.post("OnInput",self.buffer)
self.buffer=""
else:
self.buffer+=data
self.handler.post("GetInput")
В следующем выводе есть несколько вещей, не связанных с этим, они являются "Привет, мир!" это происходит почти мгновенно, и "ТЕСТОВОЕ ЗАДАНИЕ!" около 5 секунд.Привет" это то, что я набрал, ввод, "к" это то, что я набрал позже, после ввода обоих я нажимаю Enter один раз.
Выход:
0.0147 Verbose 1 SocketReader Created reader
0.0156 Verbose 2 SocketWriter Created writer
0.0260 Information 0 SocketReadWriter Created and ready for: ('localhost', 8294)
0.0268 Information 3 GetInput Select
Hello World!
1.0281 Information 3 GetInput Select timed out
1.0584 Information 3 GetInput Select
2.0593 Information 3 GetInput Select timed out
2.0896 Information 3 GetInput Select
3.0900 Information 3 GetInput Select timed out
3.1203 Information 3 GetInput Select
4.1215 Information 3 GetInput Select timed out
4.1519 Information 3 GetInput Select
TEST!
5.1524 Information 3 GetInput Select timed out
5.1828 Information 3 GetInput Select
hello
6.1467 Information 3 GetInput Read: h
6.1770 Information 3 GetInput Select
7.1782 Information 3 GetInput Select timed out
7.2086 Information 3 GetInput Select
8.2098 Information 3 GetInput Select timed out
8.2401 Information 3 GetInput Select
9.2414 Information 3 GetInput Select timed out
9.2717 Information 3 GetInput Select
10.2723 Information 3 GetInput Select timed out
10.3026 Information 3 GetInput Select
k
10.7939 Information 3 GetInput Read: e
10.8243 Information 3 GetInput Select
10.8245 Information 3 GetInput Read: l
10.8547 Information 3 GetInput Select
10.8549 Information 3 GetInput Read: l
10.8851 Information 3 GetInput Select
10.8853 Information 3 GetInput Read: o
10.9155 Information 3 GetInput Select
10.9157 Information 3 GetInput Read:
10.9459 Information 3 GetInput Select
10.9461 Information 3 GetInput Read: k
10.9763 Information 3 GetInput Select
You said: hello
11.9775 Information 3 GetInput Select timed out
12.0123 Information 3 GetInput Select
13.0133 Information 3 GetInput Select timed out
13.0437 Information 3 GetInput Select
^C13.3985 Verbose 2 Threads Thread: 2 has ended
14.0442 Information 3 GetInput Select timed out
14.0746 Information 3 GetInput Select
14.3622 Verbose 1 Threads Thread: 1 has ended
15.0758 Information 3 GetInput Select timed out
15.1363 Information 3 GetInput Select
16.1373 Information 3 GetInput Select timed out
16.1677 Verbose 3 Threads Thread: 3 has ended
Это легче увидеть здесь:http://pastebin.com/raw.php?i=H6UHHmy8
Какие'странно?
Он читает "ч" привет, но нечитать "Привет" пока k не произойдет, это всегда на 1 букву впереди 1 новой строки после, если это имеет смысл.
Многократные вызовы для выбора вызовут проблему? (в другом потоке читатель сокетов также использует select)
Формат для журнала:
* Время с момента запуска программы
* Уровень журнала
* Идентификатор потока (уникальный среди запущенных потоков)
* Журнал тег
* Журнал сообщений
Что делает класс Handler
Это позволяет потокам безопасно отправлять сообщения друг другу, обработчик проверяет очередь (и любые зарегистрированные события происходят в определенное время, например, ТЕСТ, который происходит в другом потоке, нене волнуйтесь), пост "GetInput» планирует другой вызов GetInput, помещая его в конец очереди. "OnInput» сообщение передается обработчику другого потока, который я хочу обработать с помощью input.I '
мы сделали это таким образом, потому что это обеспечивает хороший способ обработки потоков и означает, что у меня есть хороший повторно используемый код (например, SocketReadWriter), я надеюсь, что это не такне приводит к критике моей модели потоков, но на самом деле это работает. Проблема в моей попытке получить пользовательский ввод.
Вы также можете видеть, когда я нажимаю ctrl + c, что это отключается, это то, что делает toClose. Когда выберите время ожидания, если оно должно быть закрыто, оно будет. Поток завершается, когда у него не осталось обработчиков (обработчики вступают во владение только после того, как функция, которую должен запустить поток, вернулась, эта функция может создать класс, который имеет обработчик для члена, таким образом, когда конструктор возвращается, а функция возвращает , там's обработчик, поддерживающий класс в живых)
Работа вокруг
def getInput(self):
log.log(log.INFO,"GetInput","Select")
if sys.stdin.closed:
readsReady = []
else:
readsReady = select.select((sys.stdin,),(),(),1)[0]
if len(readsReady) == 0:
#timed out
log.log(log.INFO,"GetInput","Select timed out")
if not self.toClose:
self.handler.post("GetInput")
else:
threads.getCurrentThread().removeAllHandlers()
else:
data = sys.stdin.readline()
if len(data) == 0:
log.log(log.WARN,"GetInput","No data was returned indicating the file was closed")
self.handler.post("GetInput") #if this is a close event, the next
#timeout will deal with it
return
if data[-1] == "\n":
data = data[:-1]
log.log(log.INFO,"GetInput","Read: "+data)
self.onInputHandler.post("OnInput",data)
#if data == "\n":
# self.onInputHandler.post("OnInput",self.buffer)
# self.buffer=""
#else:
# self.buffer+=data
self.handler.post("GetInput")
def onClose(self):
#log.log(log.WARN,"Input: OnClose","Called")
self.toClose = True
sys.stdin.close()