gpt4 book ai didi

python-2.7 - Python BaseHTTPServer 和 Tornado

转载 作者:行者123 更新时间:2023-12-04 04:54:08 25 4
gpt4 key购买 nike

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

server = ThreadedHTTPServer(('', int(port)), MainHandler)

接下来我根据这里的信息 fork : Daemonizing python's BaseHTTPServer

然后我这样做:
server.serve_forever()

我想要做的是让相同的 Python 脚本也运行 Tornado WebSocket 服务器,我尝试创建第二个处理程序,并在我的主要创建类似于上面的第二个服务器,但随后 serve_forever() 块(我假设)和我无法启动 Tornado WebSocket 服务器。

我也考虑过使用 Tornado 来为我的一般 Web 内容提供服务,但性能太差且无法使用,所以我更愿意将它同时运行,除非有更简单的替代方法来将 WebSockets 添加到 BaseHTTPServer。

任何人都可以提供解决方案吗?

最佳答案

是的,serve_forever()阻止这一切。您可以使用 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属性设置超时。我不确定这样做是否正确。其他方法: http://code.activestate.com/recipes/499376/

另一种解决方案:在自己的线程中运行每个服务器:
#!/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()

关于python-2.7 - Python BaseHTTPServer 和 Tornado,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com