2014-09-21 2 views
1

Мне нужно иметь асинхронно интерактивную обработку журналов (читать, когда что-то происходит и записывать) через сокет 2eb некоторых файлов на сервере, но сначала я хочу понять, как интерактивно и асинхронно читать и напишите файл.Tornado and tornado.iostream.PipeIOStream

Я все еще нахожусь в «чтении».

Если я выполнить следующий фрагмент кода и то время я открываю консоль и написать через

echo foo > file.txt 

Я ожидаю, что что-то произойдет в консоли торнадо. Но ничего. Некоторые советы? Документация не содержит какой-либо пример о tornado.iostream.PipeIOStream (или я не нашел их)

import os 

import tornado.ioloop 
import tornado.web 

clientpath = '../client' 
port = 8888 


class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.render("index.html") 


def tail(data): 
    print "> ", data, " ." 

if __name__ == "__main__": 
    settings = { 
     "template_path": os.path.join(os.path.dirname(__file__), clientpath) 
    } 

    handlers = [ 
     (r"/", MainHandler), 
    ] 

    fd = open("file.txt") 
    stream = tornado.iostream.PipeIOStream(fd.fileno()) 
    stream.read_until('\n', tail) 

    application = tornado.web.Application(handlers, **settings) 
    application.listen(port) 
    tornado.ioloop.IOLoop.instance().start() 

ответ

2

Базового системных вызовов (выберите, Epoll и т.д.) на самом деле не поддерживает обычные файлы, поэтому PipeIOStream тоже не работает. Они достаточно близки, что иногда они выглядят так, как будто они работают, но вы не можете получить уведомление, когда файл изменился, и есть разные типы поведения вокруг конца файла. Вы должны использовать каналы или сокеты для межпроцессного общения, а не обычные файлы.

Чтобы имитировать поведение tail -f, используйте add_timeout или PeriodicCallback для стат файл периодически и читать из него всякий раз, когда изменяется размер (это все tail -f не делали на большинстве систем до относительно недавнего времени). Вы также можете использовать inotify для более эффективного обнаружения, когда файл изменяется, хотя интеграция inotify с Tornado остается в качестве упражнения для читателя.

+0

Я думал, что избежать PeriodicCallback - это лучший способ. Так что же, вместо обычного файла, использовать некоторые внешние устройства? Обычно, если я пишу 'open ('/ dev/tty ..')' Я получаю хорошие результаты .. может ли он работать с PipeIOStream? – nkint

+0

Я не очень много сделал, но думаю, что PipeIOStream работает с устройствами TTY. –

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