On Saturday, September 1, 2012 3:28:52 PM UTC-4, Laszlo Nagy wrote:
> > Hi
>
> >
>
> > does running on tornado imply that you would not consider twisted
>
> > http://twistedmatrix.com ?
>
> >
>
> > If not, twisted has exactly this capability hiding long running
>
> > queries on whatever db's behind deferToThread().
>
> All right, I was reading its documentation
>
>
>
> http://twistedmatrix.com/documents/10.1.0/api/twisted.internet.threads.deferToThread.html
>
>
>
> It doesn't tell too much about it: "Run a function in a thread and
>
> return the result as a Deferred.".
>
You can find more documentation here:
http://twistedmatrix.com/documents/current/core/howto/threading.html
Also, Twisted has dedicated APIs for interacting with databases asynchronously:
http://twistedmatrix.com/documents/current/core/howto/rdbms.html
Additionally, there is a non-blocking (rather than thread-based) implementation
of the above API available for PostgreSQL:
http://pypi.python.org/pypi/txpostgres
>
>
> Run a function but in what thread? Does it create a new thread for every
>
> invocation? In that case, I don't want to use this. My example case: 10%
>
> from 100 requests/second deal with a database. But it does not mean that
>
> one db-related request will do a single db API call only. They will
>
> almost always do more: start transaction, parse and open query, fetch
>
> with cursor, close query, open another query etc. then commit
>
> transaction. 8 API calls to do a quick fetch + update (usually under
>
> 100msec, but it might be blocked by another transaction for a while...)
>
> So we are talking about 80 database API calls per seconds at least. It
>
> would be insane to initialize a new thread for each invocation. And
>
> wrapping these API calls into a single closure function is not useful
>
> either, because that function would not be able to safely access the
>
> state that is stored in the main thread. Unless you protet it with
>
> locks. But it is whole point of async I/O server: to avoid using slow
>
> locks, expensive threads and context switching.
>
>
>
> Maybe, deferToThread uses a thread pool? But it doesn't say much about
>
> it. (Am I reading the wrong documentation?) BTW I could try a version
>
> that uses a thread pool.
>
>
>
> It is sad, by the way. We have async I/O servers for Python that can be
>
> used for large number of clients, but most external modules/extensions
>
> do not support their I/O loops. Including the extension modules of the
>
> most popular databases. So yes, you can use Twisted or torandoweb until
>
> you do not want to call *some* API functions that are blocking. (By
>
> *some* I mean: much less blocking than non-blocking, but quite a few.)
>
> We also have synchronous Python servers, but we cannot get rid of the
>
> GIL, Python threads are expensive and slow, so they cannot be used for a
>
> large number of clients. And finally, we have messaging services/IPC
>
> like zeromq. They are probably the most expensive, but they scale very
>
> well. But you need more money to operate the underlying hardware. I'm
>
> starting to think that I did not get a quick answer because my use case
>
> (100 clients) fall into to the "heavy weight" category, and the solution
>
> is to invest more in the hardware. :-)
>
>
>
> Thanks,
>
>
>
> Laszlo
--
http://mail.python.org/mailman/listinfo/python-list