有没有办法在gevent里面运行tornado.httpserver.HTTPServer?
我正在为一个大文件上传编写一个简单的代理服务器,这个想法很简单 - 它监视一堆服务器上的可用空间(到目前为止没有问题),并且应该将PUT请求路由到WebDAV之一服务器。为了提高效率,我希望通过chunk流式传输它,并且无法提供基于gevent的pywsgi的解决方案。
settings = setup()
log.info('Listening on %s:%d' % (settings.host, settings.port))
# server for request routing
server = WSGIServer((settings.host, settings.port), app)
# separate greenlet to periodically get info about cluster free space
monitor = gevent.spawn(storage_monitor, settings.timeout)
# setup a proper signals to stop server and monitor greenlet
gevent.signal(signal.SIGTERM, monitor.kill)
gevent.signal(signal.SIGINT, monitor.kill)
gevent.signal(signal.SIGQUIT, monitor.kill)
gevent.signal(signal.SIGTERM, server.stop)
gevent.signal(signal.SIGINT, server.stop)
gevent.signal(signal.SIGQUIT, server.stop)
# start the server
server.start()
gevent.wait()
也许我一般不理解某些事情?由于gevent文档没有更新到1.0,但这是一项非常重要的任务:)
也许用户使用gevent的StreamServer +自定义协议会更好吗?
答案 0 :(得分:2)
可以将Tornado和greenlet风格的并发结合起来(参见例如Motor,或this question上的最佳答案),但它很复杂,主要用作同步和异步世界之间的桥梁。在一个新项目中,我会敦促你选择一种风格并坚持下去,而不是结合多个复杂的框架。
其次,Tornado的HTTPServer目前(版本3.1)不支持流请求,因此它不能满足您的需求。我认为Twisted确实如此,但我再次建议选择Twisted或gevent而不是尝试将它们组合起来。