在一个挂架控制器中,我想首先返回对请求的响应(以便用户尽快得到响应),然后执行一些不需要的附加操作(比如更新视图计数等)恰好产生了回应。做这种事情的最佳做法是什么?在塔架中,如何在编写回应后执行操作?
谢谢!
在一个挂架控制器中,我想首先返回对请求的响应(以便用户尽快得到响应),然后执行一些不需要的附加操作(比如更新视图计数等)恰好产生了回应。做这种事情的最佳做法是什么?在塔架中,如何在编写回应后执行操作?
谢谢!
在大多数基于wsgi的服务器上(比如标准的wsgiref,nwsgi等),有一种方法可以将身体的某些部分发送出去并发送更多的内容。我想“发送更多”是可选的。
使用收益而不是回报。 WSGI的例子(不知道是否转换顺利进入主塔):
def application(environ, start_response):
start_response('200 OK', [('Content-type','text/plain')])
yield 'body starts. You should see this in browser already'
# do something
yield 'some more of body'
一旦请求处理用完的代码运行,它关闭连接。
现在,这一定会在我尝试过的标准wsgi服务器上工作。我想听听这是否适用于主塔。
我没有尝试Python的线程还没有机会,但你可以这样做:
def controller_method(self):
# controller logic here
html = render('/template.mako')
# start a thread here
return html
通过所有的逻辑后,启动线程,但只是在返回前,你应该避免冲突线程。
您可能还会看看RabbitMQ或其他消息队列软件。您可以通过发送队列中的作业来卸载主要的Web应用程序。
谢谢!我想有没有简单的方法来刷新响应,然后在相同的请求线程中做更多的工作? – 2010-05-27 17:43:15
我不这么认为。如果您查看可以制作的最基本的WSGI应用程序,则可以将HTML发送到您的函数中的浏览器。 – 2010-05-29 21:29:58
线程可能工作,但他们可能不会。尤其是长寿命的后台线程和服务器关闭有问题:如果你不让它们守护线程,服务器可能永远不会关闭;如果你使它们成为守护进程线程,那么它们可能会在关键操作中被中断,并带有奇怪的副作用,如所有模块全局变为None,导致出现奇怪的错误。我还没有使用Pylons环境中的线程,但Pylons邮件列表对这些问题进行了一些讨论。 – 2010-07-07 21:50:50
请注意,很多WSGI中间件在传递之前都会收集所有响应。 IIRC WebError就像这样,所以如果你在Pylons的development.ini文件中debug = true,那么这种背景可能不起作用。 – 2010-07-07 21:48:25