2011-07-20 98 views
7

我正在为一个扭曲的应用程序构建一个Web界面,并且希望直接使用WSGI而不是twisted.web(因为网站的其余部分是WSGI,而且我已经有了一个相当大的WSGI代码库)。异步WSGI与扭曲

的扭曲文档页面,我发现约WSGIResource(http://twistedmatrix.com/documents/current/web/howto/web-in-60/wsgi.html)规定: 像任何其他WSGI容器,在WSGI应用程序中不能执行异步操作,即使这是一个Twisted WSGI容器。

这是否是真的?在WSGI中执行twisted.web风格的异步Web请求处理方式有没有比这更简单的方式 - 可能是另一个自由软件项目的一部分?假设没有,我的计划是让WSGI线程在反应器线程中完成它们的异步工作并通过轮询来阻塞,直到数据可用。这并不漂亮。

如果有一个合理简单的异步处理WSGI请求的方式,我很乐意听到它。

+1

运行wsgi与扭曲的线程池很容易,请参阅http://stackoverflow.com/questions/5248825/web-interface-for-a-twisted-application –

+0

为什么它的价值,我其实很喜欢'twistd web'生产中的wsgi容器。配置比cherryd更容易,并且比Apache + mod_wsgi更加快速和耐用。 – SingleNegationElimination

回答

5

为什么要使用WSGI并执行异步事件? WSGI的好处是您可以在任何WSGI容器上部署您的应用程序。如果您开始使用Twisted API来执行异步事件,那么您只能在Twisted的WSGI容器中部署应用程序。

您应该使用不带WSGI的Twisted Web作为异步代码。

+1

这是一个更大的基于WSGI的Web应用程序的一个组件 - 唯一需要使用扭曲的部分 - 所以我希望避免对基于WSGI的框架进行大量重写。无论如何,你是对的,我要用香草Twisted Web代替。 –

+1

也可以使用vanilla Twisted Web调用具有WSGI接口的相同代码库。实际上,Twisted Web只是一些方法 - 'getChild','render_GET','render_POST' - 你实现的应用程序暴露。因此,您需要在边界处编写一些粘合代码,但您实际上不应该为了使用该界面而从头开始重新编写所有内容。 – Glyph

5

原则上,WSGI本质上与异步程序设计不兼容;实际上,PEP 333需要相当长的时间来指定服务器,应用程序和中间件必须如何表现以支持这种事情。

其核心是将迭代器返回到容器。每次调用一个异步的wsgi app_iter时,它都会检查所有挂起的异步任务(数据库连接等等),如果其中任何一个有数据,app_iter会产生一些数据;否则它会产生一个空字符串。为了支持这一点,一个wsgi容器需要跟踪所有正在进行的请求,并依次迭代每个请求以获取更多数据,并为其负责的任何其他延期工作提供服务。

原则上,很少有wsgi应用程序或框架实际执行此操作。几乎总是,wsgi框架因各种原因而阻塞;从磁盘读取文件或从数据库中加载数据出于任何原因(大多数ORM使得这是一个难以避免的问题。)Twisted的wsgi容器在假设下运行,因为一些wsgi应用程序阻止,也许任何wsgi应用程序可能会阻止,并且因此总是在一个线程中运行它们。

你可以做两件事;要么探索扭曲的自己的网络框架,这是相当稳固的;或者考虑创建一个wsgi包装器,用于在扭曲的容器外部扭曲。确保wsgi应用程序实际上是异步的,这肯定是后者的前提条件,但是wsgi本身非常简单,只是一个比http简单的包装器,所以它应该很容易。