2016-03-17 4 views
0

Я пытаюсь написать однопоточную неблокирующую программу с системным вызовом select. Однако с обработчиками файлов это не работает.Использовать выбор системного вызова с файлами

Вот код:

import sys 
import select 

while True: 
    file_handler = open('filename.txt') 
    inputs = [file_handler, sys.stdin] 
    try: 
     _input, _output, _error = select.select(inputs, [], []) 
    except select.error, e: 
     print e 

    for i in _input: 
     txt = i.readline() 
     if len(txt) > 0: 
      print 'txt:', txt 

Достигает сообщение для печати, когда есть новый вход со стандартного ввода, но не тогда, когда новая строка записывается в файл. Он отлично работает при использовании sockets вместо файлов.

+1

Файлы не работают. Файл не отслеживается для изменений. Вы не будете знать, что указатель файла продвинулся до тех пор, пока вы снова не прочитаете файл. Возможно, вам повезло с 'inotify' (предполагается, что это linux). Я не использовал 'pyinotify' в годах, но это было довольно ужасно, и было лучше взломать собственное решение из его кишок. – tdelaney

ответ

3

Какой операционной системой вы пользуетесь? Windows или UNIX или MacOS X или что?

Традиционно вызов select() в системах с UNIX-подобным образом возвращает файлы как «всегда читаемые» и «всегда записываемые», поэтому попытка использования select() для мультиплексирования ввода-вывода не будет полезна.

В Windows, select() на файлах не ожидается вообще, поскольку это функция библиотеки WinSock.

Существуют различные функции «уведомления о файлах» и API-интерфейсы, которые могут быть лучше для вашего конкретного случая - у Python даже есть некоторые библиотеки, которые абстрагируют код, специфичный для ОС. Однако это не будет очень хорошо взаимодействовать с сокетами, поэтому я считаю, что лучший способ получить программу, которая «реагирует на входные сокеты» и «реагирует на изменения файлов» без использования опроса, заключается в создании одной или нескольких потоков Python ,

+1

В Linux вы можете использовать дескриптор файла, возвращенный [inotify_init] (http://man7.org/linux/man-pages/man7/inotify.7.html) в сочетании с Python-wrapped 'select',' poll' , и 'epoll'. Это было так, начиная с Linux 2.6.13 (выпущено в 2005 году) и очень хорошо взаимодействовать с сокетами. Решения Windows и OSX выглядят как крушение поезда в этом отделе. –

Смежные вопросы