我可以同时使用uwsgi和(tornado, gevent等)吗?

3 投票
2 回答
2011 浏览
提问于 2025-04-17 18:00

为什么呢?因为我有一个Django项目,它需要从用户那里获取数据,并且使用很多网络服务来展示结果,目的是让用户比较信息。这有点像一些聚合网站,它们通过航空公司的网络服务搜索机票,并实时显示结果,以便用户比较票价。

现在,我是在一个“等待页面”上实现这个功能,Celery会去调用网络服务,而jQuery每5秒询问一次结果是否准备好了,等结果准备好后再跳转到结果页面。

我想做的是不使用这个“等待页面”,而是希望在结果到达时,实时更新结果页面。我想按照最佳实践来做,也就是说,我不想让jQuery每隔一段时间去获取结果来更新表格。

我觉得一些基于协程的Python库可以帮助我,但我想先了解一下你们的经验,并看看一些例子。我有点困惑,因为这个项目的这一部分是设计成异步运行的,也就是用Celery来调用网络服务,但并没有设计成通过应用服务器实时分发信息。

目前的架构是:Python 2.7,Django 1.3,PostgreSQL 9,Celery 3 + Redis,uWSGI,Nginx,全部托管在AWS上。

提前谢谢你们。

2 个回答

0

我不太了解uWSGI和gevent的搭配,但你可以把Tornado和uWSGI一起用。Tornado其实在它的tornado.wsgi.WSGIContainer模块里自带了WSGI的支持,这样就能和其他WSGI服务器,比如uWSGI和gunicorn兼容。不过,这要看你的具体需求,我觉得把一个异步框架和一个同步服务器(像uWSGI)放在一起用并不是个好主意。Tornado对此也有警告。

WSGI是一个同步接口,而Tornado的并发模型是基于单线程的异步执行。这意味着用Tornado的WSGIContainer运行一个WSGI应用时,扩展性不如在像gunicorn或uWSGI这样的多线程WSGI服务器上运行同样的应用。只有在把Tornado和WSGI放在同一个进程中能带来好处,且这些好处能弥补扩展性下降的情况下,才可以使用WSGIContainer。

2

uWSGI和gevent的组合非常不错,不过现在没有办法让uWSGI和tornado这个框架一起使用(而且uWSGI在1.9版本中已经不再支持基于回调的方式,所以我觉得我们可能永远也看不到这两者的组合能一起工作)。

在开始使用gevent之前,你需要解决一个问题,那就是确保你用到的所有组件都支持gevent(redis和celery是可以的,但你需要检查一下你的数据库适配器)。之后,只需在你的uWSGI实例中加上--gevent,后面跟上每个工作进程可以处理的最大并发请求数。

撰写回答