如何使用Python Tornado在HTTP上实现“ tail”?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用Python Tornado在HTTP上实现“ tail”?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4152字,纯文字阅读大概需要6分钟。
内容图文
我正在尝试使用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("<pre>")
self.write("Hello, world\n")
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, "\n")
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("\n")
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,而不是通过套接字程序使用.不过,这不是文档功能,因此我为每个连接启动一个套接字程序.
解决方法:
经过更多调试之后,结果证明该尾部服务器毕竟没有阻塞.
我试图在打开两个Firefox窗口的情况下测试并发连接,但是Firefox在手动停止第一个窗口之前不会开始获取第二个窗口.我想Firefox不喜欢有两个并发的HTTP连接来获取相同的资源.
打开Firefox窗口和Chromium窗口,我可以看到“ tail”输出已推送到两个选项卡.
谢谢你的帮助. @abarnert的评论特别有用.
编辑:
在即将发布的Tornado 2.4.2版本中,为“Pipe” IOStream is implemented.使用此代码和常规的“ tail”可简化代码.
import subprocess
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
def get(self):
print "GOT REQUEST"
self.p = subprocess.Popen(
["tail", "-f", options.inputfile, "-n+1"],
stdout=subprocess.PIPE)
self.write("<pre>")
self.write("Hello, world\n")
self.flush()
self.stream = tornado.iostream.PipeIOStream(self.p.stdout.fileno())
self.stream.read_until("\n", self.line_from_nettail)
def on_connection_close(self, *args, **kwargs):
"""Clean up the nettail process when the connection is closed.
"""
print "CONNECTION CLOSED!!!!"
self.p.terminate()
tornado.web.RequestHandler.on_connection_close(self, *args, **kwargs)
def line_from_nettail(self, data):
self.write(data)
self.flush()
self.stream.read_until("\n", self.line_from_nettail)
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()
内容总结
以上是互联网集市为您收集整理的如何使用Python Tornado在HTTP上实现“ tail”?全部内容,希望文章能够帮你解决如何使用Python Tornado在HTTP上实现“ tail”?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。