On Mon, Jun 14, 2010 at 6:28 PM, Christopher Armstrong <radix@twistedmatrix.com> wrote:
On Mon, Jun 14, 2010 at 5:42 PM, Allen Bierbaum <abierbaum@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

Thanks,
Allen