On Mon, Oct 7, 2013 at 12:01 PM, Jonathan Vanasco <[email protected]> wrote:
> so the popular workaround(s) are to do both:
>
> 1- defer to thread (which most people would do anyways)
> 2- open/close multiple sessions (which are cheap). basically , instead of
> approaching a "task" in twisted as a single action of multiple components,
> think of it like a website , with each action as a new page request. your
> "web session" is the same, but your "SqlAlchemy Session" changes on each
> request.
There's a 3.
3- open a single request-scope session, and carry it through your async tasks.
You'll have to be super-careful not to use any thread-local state,
always use the request-scope session, but that's relatively easy with
most frameworks. Probably the easiest way would be to instantiate an
explicit session with a session_maker, and then carry it implicitly in
your callbacks as a closure. This is even easier on web frameworks,
that support this kind of stuff built-in since it's so very common.
But, adapting, got_api:
def process_request():
d = deferToThread( get_api, session_maker() ).addCallback(got_api)
def get_api(session)
# use session
<block>
def got_api():
process data
At first sight, this doesn't look all that better, but when you start
chaining deferreds, it will be.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.