Correction. It was cherrypy's fault. It uses 'implicit' locking of web sessions by default ('tools.sessions.locking'). We changed it to 'explicit' and call web_session.acquire_lock() / web_session.release_lock() manually when we need to. This works like a charm!
HTH, Ladislav Lenart On 11.6.2013 10:58, Ladislav Lenart wrote: > Hello. > > Problem solved! It was a false alarm. My Firefox simply serializes all > requests > to one domain. (BTW Chrome does that too.) This is strange however, because I > have more connections enabled in Firefox about:config (network.http.* and > friends). Have anyone of you solved this? > > > Thank you and sorry for the noise, > > Ladislav Lenart > > > On 11.6.2013 09:08, Ladislav Lenart wrote: >> Hello. >> >> >> On 10.6.2013 18:41, Michael Bayer wrote: >>> >>> On Jun 10, 2013, at 11:46 AM, Ladislav Lenart <lenart...@volny.cz> wrote: >>> >>>> >>>> I have no idea what is wrong. Please help me diagnose this! Note that OS >>>> monitor >>>> shows several cherrypy threads, each gets its share, so the cherrypy setup >>>> seems >>>> to be OK. >>>> class _SessionContext(object): >>>> def __init__(self): >>>> self._level = 0 >>>> >>>> def __enter__(self): >>>> if self._level == 0: >>>> self._session = _Session() >>>> self._level += 1 >>>> return self._session >>>> >>>> def __exit__(self, type_, value, traceback): >>>> self._level -= 1 >>>> if self._level == 0: >>>> self._session.close() >>>> self._session = None >>>> >>>> _thread_local = local() >>>> >>>> def get_session(): >>>> ctx = getattr(_thread_local, 'session_context', None) >>>> if ctx: >>>> return ctx >>>> ctx = _SessionContext() >>>> _thread_local.session_context = ctx >>>> return ctx >>> >>> >>> what's all this thread local stuff for? The problem is likely there, a >>> scoped_session() already uses a threading.local. A very simple usage >>> pattern should work fine. Just put a "session.remove()" type of thing to >>> occur at the end of each request. guidelines are here: >>> http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#using-thread-local-scope-with-web-applications >>> >> >> Well, this is our way to call Session.remove() at the end of the request >> processing. >> >> get_session() creates _SessionContext instance (a python context manager) >> responsible for closing the session at the end. We use scoped_session() and >> we >> wanted to support nesting like this: >> >> with get_session(): >> with get_session(): >> ... >> >> Hence we create only one _SessionContext per thread. It increments its >> internal >> counter whenever its __enter__() is called and decrements it whenever its >> __exit__() is called. It closes the session when the counter reaches zero. >> >> The decorator @session.use wraps the function in the call >> >> with get_session(): >> >> We mark every method of our handler that needs to access a database with this >> decorator. It is always the top level decorator, i.e.: >> >> @session.use >> @other_decorator >> def foo(): >> pass >> >> I will investigate further and let you know. >> >> >> Thank you, >> >> Ladislav Lenart -- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy?hl=en. For more options, visit https://groups.google.com/groups/opt_out.