Re: Database Connections

[email protected] Tue, 10 Aug 2004 02:48:06 +0200
Newsgroups gmane.comp.python.modeling
Message-ID <[email protected]>
On Friday 06 August 2004 21:44, Sebastien Bigaret wrote:

[snip]

First .. i'm very busy w/ computer off, right now so ..

Anyways

> I'm not sure this is exact --I've read your post there, and I do not 
> agree w/ your analysis: I can be wrong of course since my experience w/
> mod_python is really thin, but to my understanding there is a global
> namespace available w/ mod-python, the global namespace that exists
> within the subinterpreter dedicated to an application.


First, i won't talk about apache1 but take care that apache2 isn't really 
stable. I use it in production right now but i disabled the thread support.
I get to much trouble w/ it.  They is 3 kind of process handling in apache2
fork / thread / mixed (i don't recall it but i hope it's true ..:) 

I won't go deeper in explain but cut/paste the answer i got about MPServlet
(which use mod_python + apache2) from Daniel Popowich:


""" 
Your questions are related to each other and are frequently asked on
the mod_python discussion list.  The problem with maintaining global
data with mod_python (and servlets doesn't solve this issue) is
tightly related to how apache maintains processes and threads.  If you
are on linux or other unix-like OS, then apache uses the prefork MPM
by default.  This is a multi-process MPM where each request is handled
by a separate process, so you end up with N python interpreters, where
N is the number of processes apache has forked.  In such an
environment, the only way to have global data is through some external
storage: sessions, db, shared memory, etc.

For unix, there is the worker MPM which is a hybrid
multi-process/multi-threaded server.  With worker you can control
apache such that you have ONE process with multiple threads.  I know
one person who is using servlets in such a manner.  (This is the
default on windows with the winnt MPM.)  In such an environment you
can have global data shared across requests, but of course, you'll
have to wrap your data in mutexes of some sort to avoid threads
stepping on each other.

If the data you want shared across requests is tied to a particular
user, then sessions are an excellent solution.  Light-weight and
pretty fast.  Servlets has builtin support for sessions; see the api
doc or the tutorial.
"""

In short, using if you're using the fork behaviour, you can't share
data. So in modeling => time consuming import .. and multiple
(with no way to reduce without restart ).. interpreter .. not talking
about the trouble you can get if you have some multiple virtual host 
etc etc ..

If you want to share data, you need to use the multi-thread, but 
you have to play w/ python thread/mutexes. And everybody around 
know I don't want to play w/ thread. In modeling, i don't know if 
you can do something like this. I mean, share a 'global' editing 
context, and garantues that it's thread safe. (without of course
ending w/ a lock/unlock around each http request). I use SQObject 
for a couple of things right now, and I get exactly this kind of 
troubles. For example SQLite or MySQL DB Api aren't thread safe. 
(I get weird issues about lost connection in MySQL) .. 


So that's the dilemma (the post in my blog, is about all kind 
of web frameworks, but here is example)  If you don't want to 
share objects, ok but you will loose time because you can use 
some cache behaviours .. 
I you want to share, it's ok, but you need to play w/ generator
(àla Twisted) or to play w/ the mutexes. And i didn't find a way to
do it the nice way, because most of python modules doesn't
scale very well in threaded env. 

In my point of view, quixote offer a good way to handle this. 
Because it use the same prefork / reuse process that apache
does. So you don't have to deal w/ threadObuggy modules, and 
you can really handle multiples connections without any other
artifact, and without loosing time in big lock/unlock. 

(I know Zope can handle multiple cnx without too much pain
 by threading. But Zope's threads aren't really used to do 
 multiple task at the same time. It's just a way to accept http
 request without locking ..) 

> > Look at http://www.larsen-b.com/Article/130.html for little deeper
> > explain of the problem.
> >
> > I haven't do this kind of stuff for a while.. but i think Modeling need
> > something like Durus do .. a server process.. :)
>
> Interesting indeed, I'll have a look at that. Do you have experience
> with this?  How do they serialize objects that are transmitted between
> the server and its client?

I played w/ it in a recent project, it's more simple than ZODB + ZEO .. 
but i don't know how it works. 


While finishing this mail, i remember that's a modeling mailing list, and 
need to apologize to other that don't want to hear about http handling 


Hope this helps. / I know i need to go to english course sooooonnnn :)


-------------------------------------------------------
SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media
100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33
Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift.
http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285