S. *_*key 7 python asynchronous wsgi twisted
我正在为扭曲的应用程序构建一个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中进行twisted.web样式异步Web请求处理是否有一些不那么hacky的方式 - 可能是另一个自由软件项目的一部分?假设没有,我的计划是让WSGI线程在反应器线程中进行异步工作,并通过轮询进行阻塞,直到数据可用.它不漂亮.
如果有一种相当简单的异步处理WSGI请求的方式,我很乐意听到它.
为什么要使用WSGI并执行异步操作?WSGI的好处是您可以在任何WSGI容器上部署应用程序.如果您开始使用Twisted API来执行异步操作,那么您只能在Twisted的WSGI容器中部署您的应用程序.
您应该只使用没有WSGI的Twisted Web作为异步代码.
原则上,WSGI本质上与异步程序设计不兼容; 实际上,PEP 333需要相当长的时间来指定服务器,应用程序和中间件必须如何支持这种事情.
其核心是将迭代器返回容器.每次调用异步wsgi app_iter时,它都会检查所有挂起的异步任务(数据库连接等),如果其中任何一个有数据,app_iter会产生一些数据; 否则它会产生一个空字符串.为了支持这一点,wsgi容器需要跟踪所有正在进行的请求,并依次迭代每个请求以获取更多数据,此外还要为其负责的任何其他延期工作提供服务.
原则上,很少有wsgi应用程序或框架实际执行此操作.几乎无一例外,wsgi框架因各种原因而受阻; 因为任何原因从磁盘读取文件或从数据库加载数据(大多数ORM都会使这个问题成为一个难以防止的问题.)Twisted的wsgi容器在假设由于某些wsgi应用程序阻止,也许任何wsgi应用程序可能阻塞的情况下运行,并且因此总是在一个线程中运行它们.
你可以做两件事; 探索扭曲自己的网络框架,这是相当坚实的; 或者考虑在扭曲的自己的容器外面创建一个wsgi包装器.确保wsgi应用程序实际上是异步的当然是后者的先决条件,但是wsgi本身非常简单,是一个瘦的包装器,因此它应该很容易.