[Twisted-web] [Twisted-Python] twisted.web questions
Allen Bierbaum
abierbaum at gmail.com
Tue Jun 15 11:12:52 EDT 2010
On Mon, Jun 14, 2010 at 6:28 PM, Christopher Armstrong <
radix at twistedmatrix.com> wrote:
> On Mon, Jun 14, 2010 at 5:42 PM, Allen Bierbaum <abierbaum at gmail.com>
> wrote:
> > Something like this:
> >
> > def _bg_GET(self, request):
> > # Do something slow
> > request.write(result)
> > return request
> > def render_GET(self, request):
> > d = deferToThread(self._bg_GET, request)
> > d.addCallback(lambda r: r.finish())
> > return NOT_DONE_YET
> >
> > That seems to work, but I would like to
> > a) not use the deferToThread() and
> > b) do something that doesn't sacrifice too much performance.
> >
> > At the end of the day, what I would really like is something in
> render_GET
> > that checks the return from calling the internal GET method and if it is
> a
> > deferred it adds a callback to finish the request, if not it simply
> returns
> > the result. (this would allow me to use deferToThread, inlineCallbacks,
> etc
> > as needed in my get methods)
> >
> > Can you see any issues with doing something like this? (it seems almost
> too
> > simple so I expect that I must be missing something)
>
> Yeah, don't call request methods (like request.write) from the
> function that gets run in a thread. You should be calling
> request.write in the callback, or with callFromThread in the threaded
> function.
>
Good tip. Looks like the wsgi wrapper has a nice little helper method to
support this:
http://twistedmatrix.com/trac/browser/tags/releases/twisted-10.0.0//twisted/web/wsgi.py#L257
<http://twistedmatrix.com/trac/browser/tags/releases/twisted-10.0.0//twisted/web/wsgi.py#L257>
Thanks,
Allen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://twistedmatrix.com/pipermail/twisted-web/attachments/20100615/bf1d50b8/attachment.htm
More information about the Twisted-web
mailing list