Python 2.7 Python BaseHTTPServer和Tornado

Python 2.7 Python BaseHTTPServer和Tornado,python-2.7,websocket,tornado,basehttpserver,basehttprequesthandler,Python 2.7,Websocket,Tornado,Basehttpserver,Basehttprequesthandler,我正在运行一个BaseHTTPServer,通过ThreadedHTTPServer,所以我得到了线程 server = ThreadedHTTPServer(('', int(port)), MainHandler) 接下来,我将根据此处的信息进行分叉: 那么我会: server.serve_forever() 我想做的是让同一个Python脚本也运行Tornado WebSocket服务器,我尝试创建第二个处理程序,主要是创建第二个服务器,与上面类似,但是serve_forever()会

我正在运行一个BaseHTTPServer,通过ThreadedHTTPServer,所以我得到了线程

server = ThreadedHTTPServer(('', int(port)), MainHandler)
接下来,我将根据此处的信息进行分叉:

那么我会:

server.serve_forever()
我想做的是让同一个Python脚本也运行Tornado WebSocket服务器,我尝试创建第二个处理程序,主要是创建第二个服务器,与上面类似,但是serve_forever()会阻塞(我假设),我无法启动Tornado WebSocket服务器


我也曾考虑过使用Tornado来为我的一般web服务,但性能非常糟糕,无法使用,因此我更愿意将其与之并行运行,除非有一种更简单的方法可以将WebSocket添加到BaseHTTPServer

有人能提供一个解决方案吗?

是的,
永远服务()
阻止了这一切。您可以使用
handle_request
一次处理一个请求。为了确保它不会阻塞,您必须设置超时。要定期运行它,可以使用
tornado.ioloop.PeriodicCallback
。例如:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class Handler(BaseHTTPRequestHandler):  
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        message =  threading.currentThread().getName()
        self.wfile.write(message)
        self.wfile.write('\n')
        return

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!\n')

if __name__ == '__main__':
    # create Tornado Server
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)

    # create BaseHTTPServer
    server = ThreadedHTTPServer(('localhost', 8080), Handler)
    server.timeout = 0.01 

    tornado.ioloop.PeriodicCallback(server.handle_request, 100).start() # every 100 milliseconds
    tornado.ioloop.IOLoop.instance().start()
运行:

$ curl http://localhost:8080/
Thread-1
$ curl http://localhost:8080/
Thread-2
$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8080/
Thread-3
$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8080/
Thread-4
$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8000/
Hello, friendly user!
我在这里使用了
timeout
属性来设置超时。我不确定这样做是否合适。其他方法:

另一种解决方案:在自己的线程中运行每台服务器:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class Handler(BaseHTTPRequestHandler):  
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        message =  threading.currentThread().getName()
        self.wfile.write(message)
        self.wfile.write('\n')
        return

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!\n')

def run_tornado():
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

def run_base_http_server():
    server = ThreadedHTTPServer(('localhost', 8080), Handler)
    server.serve_forever()

if __name__ == '__main__':
    threading.Thread(target=run_tornado).start()
    threading.Thread(target=run_base_http_server).start()

“表演令人敬畏,无法使用”?应该很近,;你是怎么测试的?不管怎样,nginx应该是最快的服务“一般web内容”的方式。我尝试了提供一个简单的静态html页面,加载它花费了很多秒。我想,现在回想起来,这是我的错误设置,而不是龙卷风的错误。哇,谢谢你非常详细的回复,也谢谢你给我选择。我将同时运行它们,看看哪一个最有效,但肯定会接受这个答案。