我需要通过服务器中某些文件的2eb套接字进行异步交互式日志操作(在发生某些情况时进行读取并进行写入),但是首先,我想了解如何以交互方式和异步方式读取和写入文件。

我仍在“阅读”部分。

如果我执行以下代码,同时打开控制台并通过

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()

最佳答案

底层系统调用(选择,epoll等)实际上并不支持常规文件,因此PipeIOStream也不支持。它们之间的距离足够近,有时看起来好像可以正常工作,但是当文件更改并且文件末尾有不同的行为时,您实际上并不会收到通知。您应该使用管道或套接字进行进程间通信,而不是常规文件。

要模拟tail -f的行为,请使用add_timeoutPeriodicCallback定期统计文件大小,并在大小变化时从文件中读取文件(大多数情况下,tail -f直到最近才这样做)。您也可以使用inotify来更有效地发现文件更改的时间,尽管将inotify与Tornado集成在一起是读者的练习。

08-06 12:39