pyqt4: multi-threaded database access
Diez B. Roggisch
deets at web.de
Wed Nov 24 09:25:46 EST 2010
Adrian Casey <caseyalice at adam.com.au> writes:
> I have a PyQt4 multi-threaded application which accesses many hosts
> concurrently via ssh. I would like each thread to have access to a
> database so that it can look up details about the particular system it
> is connected to.
>
> The easy way is to have each thread create a connection to the database.
> However, this is wasteful and likely to exhaust the maximum number of
> connections the database (postgresql) allows. Instead, I would like to
> share a single database connection between all threads. In PyQt4, this
> is not possible since the database connection can only be used by the
> thread which created it.
>
> So, I'm thinking I'll create a thread to just handle database queries.
> The worker threads will communicate with the database thread using
> signals and slots.
>
> My question is, if I have 20 worker threads who have emitted a signal
> which results in a database query, how do I ensure that the query
> results are sent back to the originating thread?
>
> Ideas, examples anyone?
First of all, do you *know* it will exhaust the connections, or is that
just some gut feeling? Because postgres can easily handle a few hundered
connections, and unless you really are exhausting these, it's the
easiest solution.
The next advice would be to create a pool of connections (pure python,
not Qt). Then you lose the "can only be used by the thread which
created it" restriction. Of course you should only use a connection from
within one thread at a time, but that shouldn't be an issue.
So all you have to make sure is that you fetch & return the connections
properly. I would use a context-manager for that:
with connection_pooll as connection:
do_some_queries(connection)
HTH,
Diez
More information about the Python-list
mailing list