簡體   English   中英

Tornado和tornado.iostream.PipeIOStream

[英]Tornado and tornado.iostream.PipeIOStream

我需要通過服務器中某些文件的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集成在一起是讀者的練習。

我知道這個問題已經很老了,但是庫aiofiles完全可以異步讀取磁盤,並且可以使它與龍卷風事件循環很好地協同工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM