Re: Async client for PostgreSQL?

2012-09-03 Thread calderone . jeanpaul
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


Re: Creating socket.connect while in epoll loop

2012-09-12 Thread calderone . jeanpaul
On Wednesday, September 12, 2012 12:01:58 PM UTC-4, Miki Tebeka wrote:
> Greetings,
> 
> I'm trying to write a reverse TCP proxy using epoll (just for learning).
> 
> I've started with the code at http://scotdoyle.com/python-epoll-howto.html 
> and got to https://gist.github.com/3707665.
>
> 
> However, I can't create a new connection. When reaching line 34 
> (backend.connect), I get the following error (on line 34):
> 
> socket.error: [Errno 115] Operation now in progress
> 

You cannot synchronously set up a new TCP connection using a non-blocking 
socket.  Instead, you begin the connection attempt and it fails with 
EINPROGRESS and then you use epoll to find out when the attempt completes.

I suggest reading the implementation of a Twisted reactor to see an example of 
how this is done.

Here are a couple links to get you started:

http://twistedmatrix.com/trac/browser/trunk/twisted/internet/tcp.py
http://twistedmatrix.com/trac/browser/trunk/twisted/internet/epollreactor.py

Jean-Paul

> 
> 
> I tried moving the socket creation to a different thread, but same problem.
> 
> Any ideas how to so fix this? (keep in mind I'm a total newbie in this area).
> 
> 
> 
> Thanks,
> 
> --
> 
> Miki
-- 
http://mail.python.org/mailman/listinfo/python-list