0

有什么方法可以在 gevent 中运行 tornado.httpserver.HTTPServer 吗?

我正在为大文件上传编写一个简单的代理服务器,这个想法很简单 - 它监视一堆服务器上的可用空间(到目前为止没有问题),并且应该将 PUT 请求路由到 WebDAV 服务器之一。为了提高效率,我想逐块流式传输它,并且无法提出基于 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 + 自定义协议会更好?

4

1 回答 1

2

可以将 Tornado 和 greenlet 风格的并发结合起来(参见例如Motor此问题的最佳答案),但它很复杂,主要用作同步和异步世界之间的桥梁。在一个新项目中,我会敦促你选择一种风格并坚持下去,而不是结合多个复杂的框架。

其次,Tornado 的 HTTPServer 目前(3.1 版)不支持流式请求,因此它也不能满足您的需求。我认为 Twisted 可以,但我还是建议选择 Twisted 或 gevent,而不是尝试将它们结合起来。

于 2013-10-04T12:55:53.903 回答