On Jan 17, 2012, at 9:03 AM, John Hufnagle wrote: > Didn't see an answer to this in the discussions. > I have: > 1. slqlchemy 0.7.3, cherrypy and mysql Ver 14.14 Distrib 5.5.18, for > osx10.6 > > 2. a cherry py application that initializes the scoped session as: > Session = scoped_session(sessionmaker(bind=engine)) > > 3a. Passes that Session instance into a background worker thread. > 3b. Passes that Session instance into the Request processing objects > that handle the http requests.
right off, I think it's important here to understand what scoped_session means. The scoped_session is only a *registry* that stores sessions, it's not a Session object itself. When you first call upon it, that is, Session(), *then* you get at an actual Session object, keyed to the current thread. If you call methods on the scoped_session object itself, those are proxied into the Session that's local tot he current thread. > > 4. in the run() method of that background thread (3a) it issues: > session_obj = passed_in_session_object() # passed_in_session_object > came in from the main from step 3a. > #this session_obj is used for SELECT's against the db > wakes up every minute and does SELECTS to see if the http handler from > 5 (below) has written any objects to the db. So it's not clear here at what point you deal with "Session" and at what point you deal with the actual Session object returned by "Session()". If you're passing actual Session objects between threads (which is not really recommended unless you're really sure of what you're doing) you'd need to make sure its the Session object, not the scoped_session registry. Overall I would refrain from passing "Session" anywhere, the recommended usage of scoped_session is as a module level global that's accessed as needed in a thread-local fashion. I'm not sure what your gaining by passing sessions between threads. Each Session has its own transaction going on, and as long as those transactions remain open they won't see any changes that have occurred since the transaction is opened (note that transactions are typically isolated from seeing concurrent changes elsewhere). It's not like you can't pass sessions between threads and such but that's an advanced technique where you'd need to be very aware of which sessions have what transactional state going on. Hence the scoped_session as a global, threadlocal registry, where all threads consult it, open a session, do their work, then close it, and that's it, is the "default" model, being the easiest to understand. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@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.