python web界面整合 tail_如何使用Python Tornado在HTTP上实现“ tail”?

我正在尝试使用Python在HTTP上实现“ tail -f”之类的东西.当前,我正在尝试使用Tornado,但即使我执行异步请求,它一次也只能处理一个连接.

import socket

import subprocess

import tornado.gen as gen

import tornado.httpserver

import tornado.ioloop

import tornado.iostream

import tornado.options

import tornado.web

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

define(

"inputfile",

default="test.txt",

help="the path to the file which we will 'tail'",

type=str)

class MainHandler(tornado.web.RequestHandler):

@tornado.web.asynchronous

@gen.engine

def get(self):

print "GOT REQUEST"

inputfile = open(options.inputfile)

p = subprocess.Popen(

"./nettail.py",

stdin=inputfile,

stdout=subprocess.PIPE)

port_number = int(p.stdout.readline().strip())

self.write("

")

self.write("Hello, world

")

self.flush()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)

stream = tornado.iostream.IOStream(s)

yield gen.Task(stream.connect, ("127.0.0.1", port_number))

while True:

data = yield gen.Task(stream.read_until, "

")

self.write(data)

self.flush()

def main():

tornado.options.parse_command_line()

application = tornado.web.Application([

(r"/", MainHandler),

])

http_server = tornado.httpserver.HTTPServer(application)

http_server.listen(options.port)

tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":

main()

我正在启动的过程是输出到套接字的简单“尾巴”.

import random

import socket

import sys

import time

#create an INET, STREAMing socket

s = socket.socket(

socket.AF_INET, socket.SOCK_STREAM)

# Open the connection.

try:

for attempt_number in xrange(5):

port_number = random.randint(9000, 65000)

try:

s.bind(("localhost", port_number))

except socket.error:

continue

# We successfully bound!

sys.stdout.write("{0}".format(port_number))

sys.stdout.write("

")

sys.stdout.flush()

break

#become a server socket

s.listen(5)

# Accept a connection.

try:

(clientsocket, address) = s.accept()

while True:

line = sys.stdin.readline()

if not line:

time.sleep(1)

continue

clientsocket.sendall(line)

finally:

clientsocket.close()

finally:

s.close()

./nettail.py可以正常工作,但是Tornado HTTP服务器一次仅处理一个请求.

我想使用长期运行的持久HTTP连接来执行此操作,因为它与旧版浏览器兼容.我了解Web套接字就是在现代浏览器中的工作方式.

编辑:

我在Linux和Solaris而不是Windows上运行它.这意味着我可以在文件上使用tornado.iostream,而不是通过套接字程序使用.不过,这不是文档功能,因此我为每个连接启动一个套接字程序.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值