Robert Brewer
fumanchu at amor.org
Mon Jun 6 12:38:11 EDT 2005
Sébastien Arnaud wrote: > I am hitting the wall on a very stupid problem that I thought I had > working. I can't get an object declared as global to remain > in memory... > Under Apache Pre-fork MPM model, this I understand, but under > the MPM > Worker model, where I specify to start 10 threads in one process, I > kind of don't get it... Maybe some of you will be able to > spot what I > am doing wrong. > > Basically, what I am trying to do is to keep the object > mySitePool in > memory since each Site object (heracles.site) has everything needed > by a thread to process a request. At the first request the > mySitePool > object should get initialized, but for any other requests it should > be simply the matter of retrieving one Site object via the Queueing > mechanism to process one request. Right now the problem is that I am > able to see for each request one entry in the apache log file that > the mySitePool is being initialized... > ... > > Apache2 mod_python (.htaccess): > ------------------------------- > PythonInterpPerDirective On > > PythonOption "SiteName" "Heracles Test site" > PythonOption "SiteDescription" "Testing the framework!" > PythonOption "SiteVirtualPath" "/heracles/" > PythonOption "SiteViewPath" "/xxx/webapp/views/" > PythonOption "MySQLhost" "xxx" > PythonOption "MySQLuid" "arnaudsj" > PythonOption "MySQLpwd" "xxx" > PythonOption "MySQLdb" "test" > > SetHandler python-program > PythonHandler heracles.site::handler > > PythonDebug On > PythonAutoReload On > > > heracles.site.py: > ----------------- > [...] > def handler(req): > """ > Standard mod_python handler code for Heracles Web Application > Framework > The SitePool is initialized based on Apache MPM setting > """ > global mySitePool > try: > mySite = mySitePool.get() > except NameError: > req.log_error("Initializing Heracles WAF at %s with > %s thread > (s)" % (req.document_root(), apache.mpm_query(6))) > mySitePool = Pool(Constructor(Site, req), > apache.mpm_query(6)) > mySite = mySitePool.get() > return mySite(req) > mySitePool.put(mySite) > [...] This may or may not fix your problem, but I highly recommend you move the construction of mySitePool out of the handler function, and use a PythonImport directive instead: In your htaccess file, add: PythonImport heracles.site interpretername ...and change your site module to read: [...] mySitePool = Pool(Constructor(Site), apache.mpm_query(6)) def handler(req): """ Standard mod_python handler code for Heracles Web Application Framework The SitePool is initialized based on Apache MPM setting """ mySite = mySitePool.get() return mySite(req) mySitePool.put(mySite) [...] ...although that will take some rework, since you were passing the request object to Constructor...?!? Anyway, that should make debugging a lot easier. Robert Brewer System Architect Amor Ministries fumanchu at amor.org
|