On Jun 25, 2010, at 3:32 AM, Yang Zhang wrote:

> On Fri, Jun 4, 2010 at 7:16 AM, afrotypa <ovuaia...@gmail.com> wrote:
>> Hi All,
>> 
>> 
>> For a while I have been toying with the idea of developing/running a
>> database (postgresql backend) driven WSGI app using an async python
>> WSGI server such as gevent.
>> 
>> Now that the newer psycopg2 (>=2.2.0) drivers provide coroutine
>> support (via a hook which makes c extension database drivers co-
>> routine friendly) I am looking to try gevent out as soon as I can
>> figure out how to integrate gevent and sqlalchemy.
>> 
>> In theory it should be possible to run blocking SQLAlchemy queries in
>> a spawned greenlet using an async DB API 2.0 driver such as psycopg2.
>> Blocking only the greenlet handling the specific request.
>> 
>> See the following URL for details of coroutine support in psycopg2:-
>> 
>> http://bitbucket.org/dvarrazzo/psycogreen/wiki/Home
>> 
>> An example of a wait call back implementation for gevent is here :-
>> 
>> http://bitbucket.org/dvarrazzo/psycogreen/src/tip/gevent/psyco_gevent.py
>> 
>> My question is what is a good pattern for using SQLAlchemy with a co-
>> routine library such as gevent in a pylons based WSGI app.?
>> 
>> For starters how do I configure the SQLAlchemy connection pool to
>> create async connections only?.
>> 
>> i.e.
>> 
>> Write a custom getconn method and passing async=True to
>> psycopg2.connect?
>> 
>> Or
>> 
>> pass connect_args to create_engine?.
>> 
>> Assuming gevent spawns a greenlet to handle each WSGI request, I think
>> SQLAlchemy should just work as usual in this situation, since the
>> scopedSession would ensure that a different SQLAlchemy session is used
>> for each request. Is this a reasonable assumption to make about this?.
>> 
>> If I wanted to run multiple independent queries (each in its own
>> greenlet) in the same pylons request, it appears I would have to
>> explicitly create an sqlalchemy session for each greenlet instance in
>> this case. Is this the case?

Writing an async SQLA application isn't a matter of figuring out implementation 
details.   That's not such a big deal.   It's  a matter of, what would the 
end-user application look like ?    Sample code ?    Best patterns for use ?    
Since I've never worked with async libraries (other than javascript), I don't 
have the best answer.

It hardly seems convenient to have entirely new Session objects for every 
query.    I really have no idea what SQLAlchemy would look like supporting 
async queries in a useful way, but this is not a matter of implementation 
within SQLA - it seems obvious that we'd need a different Connection class that 
performs the execute() call differently (since to execute, you need to give a 
callback who gets the results, right ?).      Assuming I'm not totally off base 
with that, the "you need a callback argument for every execute" pattern would 
be extracted out into a custom Session subclass and a custom Query subclass, 
which both support a "callback" calling style.   The unit of work probably 
can't take advantage of this approach, since it deals with executing many 
statements in order, and would continue to use plain "execute" to do its work - 
the modified Connection, Session, and Query would continue to implement 
"synchronous" versions of themselves for this purpose.   Similarly, lazyloaders 
and object refresh calls would still be synchronous, since they occur on 
attribute access.

That's as deep as my thought goes on this and its all based on hypotheticals 
since I've never used twisted or greenlets or anything like that.    Sorry if 
I'm totally off on how gevent/greenlets work, the linked documents didn't 
really make it clear how they work for someone who isn't already familiar.




-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to