带Twisted的异步WSGI



我正在为一个扭曲的应用程序构建一个web界面,我想直接使用WSGI而不是twisted.web(因为网站的其余部分是WSGI,我已经有了大量的WSGI代码库(。

我找到的关于WSGIResource的Twisted文档页面(http://twistedmatrix.com/documents/current/web/howto/web-in-60/wsgi.html)状态:与任何其他WSGI容器一样,您不能在WSGI应用程序中执行任何异步操作,即使这是一个Twisted WSGI容器

这一定是真的吗?在WSGI中,是否有一些不太时髦的方法来处理扭曲的web风格的异步web请求——也许是作为另一个免费软件项目的一部分?如果没有,我的计划是让WSGI线程在reactor线程中进行异步工作,并通过轮询进行阻塞,直到数据可用。它不漂亮。

如果有一种在twisted中异步处理WSGI请求的简单方法,我很乐意听到

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

对于异步代码,您可能应该只使用没有WSGI的TwistedWeb。

原则上,WSGI与异步程序设计本质上并不兼容;事实上,PEP333花了相当长的篇幅来指定服务器、应用程序和中间件必须如何运行才能支持这种东西。

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

原则上,很少有wsgi应用程序或框架真正做到这一点。几乎无一例外,wsgi框架由于各种原因而阻塞;出于任何原因从磁盘读取文件或从数据库加载数据(大多数ORM都让这成为一个很难防止的问题。(Twisted的wsgi容器的操作假设是,由于一些wsgi应用程序会阻塞,因此任何wsgi应用都可能会阻塞,并因此总是在线程中运行它们。

你可以做两件事;或者探索twisted自己的web框架,该框架相当坚固;或者考虑在twisted自己的容器之外为twisted创建一个wsgi包装器。确保wsgi应用程序实际上是异步的当然是后者的先决条件,但wsgi本身非常简单,是http上的一个瘦包装器,因此它应该足够容易。

最新更新