История:
Я знаком с функцией select()
C. Я использую эту функцию для многих purpouses. Большинство из них, если не все, для чтения и записи на трубы, файлы и т.д. Я должен сказать, что я никогда не использовал список ошибок, но это не связано с ключевым вопросом.
Вопрос:
Выполняет ли python select()
следующее:
Оказывается, что select()
на python ведет себя иначе, несмотря на простой интерфейс с C select()
. Кажется, что select()
возвращает первый раз, когда файл готов к чтению. Если вы прочитаете файл, позволяющий байтам в своей очереди, вызов select()
будет заблокирован. Но если вы снова вызываете select()
после того, как предыдущий вызов select()
был возвращен без какого-либо чтения между этими двумя вызовами, select()
вернется как ожидалось. Например:
import select
# Open the file (yes, playing around with joysticks)
file = open('/dev/input/js0', 'r')
# Hold on the select() function waiting
select.select([file], [], [])
# Say 16 bytes are sent to the file, select() will return.
([<open file '/dev/input/js0', mode 'r' at 0x7ff2949c96f0>], [], [])
# Call select() again, and select() will indeed return.
select.select([file], [], [])
([<open file '/dev/input/js0', mode 'r' at 0x7ff2949c96f0>], [], [])
# read 8 bytes. There are 8 bytes left for sure. Calling again file.read(8) will empty the queue and would be pointless for this example
file.read(8)
'<\t\x06\x01\x00\x00\x81\x01'
# call select() again, and select() will block
select.select([file], [], [])
# Should it block? there are 8 bytes on the file to be read.
Если это поведение select()
в python, я в порядке, я мог бы справиться с этим. Не то, что я ожидал, но, но это прекрасно, я знаю, что я могу с этим сделать.
Но если это не поведение select()
, я был бы признателен, если бы кто-то сказал мне, что я делаю неправильно. То, что я читал о select()
, - это то, что говорит python doc: "select() возвращает, если любой файл в списке read | write | error готов к чтению | write | error.". Это нормально, там нет лжи. Возможно, вопросы должны быть:
- Когда файл считается готовым для чтения в python?
- Означает ли это файл, который никогда не читался?
- Означает ли это файл с байтами для чтения?