【问题标题】:Tornado and tornado.iostream.PipeIOStream龙卷风和 tornado.iostream.PipeIOStream
【发布时间】:2014-09-21 14:43:57
【问题描述】:

我需要通过服务器中某些文件的 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()

【问题讨论】:

    标签: python asynchronous tornado


    【解决方案1】:

    底层系统调用(select、epoll 等)并不真正支持常规文件,因此 PipeIOStream 也不支持。它们足够接近以至于有时看起来它正在工作,但是当文件发生更改并且文件结尾有不同的行为时,您实际上无法得到通知。您应该使用管道或套接字进行进程间通信,而不是常规文件。

    要模仿tail -f 的行为,请使用add_timeoutPeriodicCallback 定期统计文件,并在大小发生变化时从中读取(直到最近,tail -f 在大多数系统上都是这样做的)。您还可以使用 inotify 更有效地发现文件何时更改,尽管将 inotify 与 Tornado 集成留给读者作为练习。

    【讨论】:

    • 我在想避免 PeriodicCallback 是一种更好的方法.. 那么使用一些外部设备而不是普通文件呢?通常,如果我写open('/dev/tty..'),我会得到很好的结果.. 它可以与 PipeIOStream 一起使用吗?
    • 我自己做的不多,但我认为 PipeIOStream 适用于 TTY 设备。
    【解决方案2】:

    我知道这个问题已经很老了,但是库 aiofiles 正是为了能够异步进行磁盘读取,并且可以很好地与龙卷风事件循环配合使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多