Python sys.stdin.read (max) блокирует до тех пор, пока не будет прочитано max (если max> = 0), блокирует до EOF, но select указывает, что есть данные для чтения

Моя проблема:

select указывает, что есть данные для чтения, я хочу прочитать все, что есть, я не хочу ждатьmax сумма присутствовать. еслиmax <= 0, тогда чтение ждет, пока не встретится EOF, если>max0 читать блоки до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()

Ответы на вопрос(1)

Ваш ответ на вопрос