[mod_python] Mod_python & global persistence

Graham Dumpleton grahamd at dscpl.com.au
Tue Mar 15 18:22:19 EST 2005


In answer to why it seems to take a few requests before the initialisation
sticks, as explained in prior email, if you are using Apache in prefork
mode this is exactly what you would expect as the first few requests
are likely performed in different processes.

I would suggest that you import the "os" module and then in your HTML
response display the result of calling "os.getpid()". If this values differs
it will show that they are different processes which are handling the
requests. As mentioned before, the data in each process is distinct and
setting the value in one doesn't cause it to be set in another process.

Anyway, this is the most likely explaination. Suggest you try seeing what
"os.getpid()" yields for each request. If it is the same for each and every
request and it still takes a few times to set the value, then come back
to us.

BTW, not a good idea to use "list" as it then hides the Python name for
creation of instances of the list type.

Graham

Wagner,Harry wrote ..
> Alan, Graham,
> Thanks for your help with this, and sorry for the delay in responding.
> I
> am still trying to understand what is happening here.  I changed my test
> script to: 
> 
> from mod_python import apache
> import sys, urllib, urlparse, xml.dom.pulldom, cgi, socket,
> xml.sax.saxutils, StringIO, math, glob, os.path, time
> 
> ddcServer = None
> resp = None
> 
> def list(req):
> 	global ddcServer
> 	now = str(time.time())
> 	if ddcServer:
> 		ddcServer.testing = "ddcServer found"
> 	else:
> 		ddcServer = DDCServer("ddcServer not found")
> 	resp = '''
> 	<?xml version="1.0" encoding="iso-8859-1"?>
> 	<!DOCTYPE html\n
> 	  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n
> 	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n
> 	<html xmlns="http://www.w3.org/1999/xhtml">\n
> 	  <head>\n
> 	    <title>ddcServerT</title>\n
> 	  <body>\n
> 	  <h1>''' + ddcServer.testing + '''</h1>
> 	  <h2>''' + now + '''</h2>
> 	  </body>
> 	</html>\n
> 	'''
> 	return resp
> 	
> class DDCServer(object):
>     def __init__(self, testing):
> 	self.testing = testing
> 
> And wrapped it in another small bit of code (ddcServerTest.py):
> 
> from mod_python import apache
> from ddcServerT2 import list
> import sys, urllib, urlparse, xml.dom.pulldom, cgi, socket,
> xml.sax.saxutils, StringIO, math, glob, os.path
> 
> def handle(req):
> 	return list(req)
> 
> This is the code that gets invoked by the mod_python.publisher handler.
> The key was to only import the list function and not the ddcServerT2
> module. 
> 
> I can't explain the results, but the first few get requests to
> ddcServerTest.py produce 'ddcServer not found'.  After that the global
> remains resident in memory (I get ddcServer found).  The display time
> changes so I know it is not being cached by my browser.  
> 
> Is this reliable?  Any ideas why it takes a few get requests before the
> global remains resident?
> 
> Thanks!  harry 
> 
> 
> ---
> not sure why your code wouldn't work. I use the equivalent of the
> following to get the effect you're looking for:
> 
> 
> ddcServer = None
> 
> def handler(req):
>     global ddcServer 
>     if not ddcServer :
>         ddcServer = DDCServer()
>         # ...
>     # ...
> 
> 
> Incidentally, I once had problems with huge memory leaks when I wrote
> code similar to yours that assigned req to a variable that persisted
> across calls. They were fixed by assigning the variable to another value
> before returning (strange but true):
> 
>     ddcServer.req = req
>     ddcServer.do_GET()
>     ddcServer.req = None
> 
> --Alan
> 
> 
> On Mon, 7 Mar 2005 16:32:27 -0500, "Wagner,Harry" <wagnerh at oclc.org>
> said:
> > Is there a way with mod_python to init global variables in a handler
> > the first time it is called, so that they are available (and already
> > initialized) in subsequent calls to the handler?  I thought the 
> > following might work, but no joy:
> > 
> > from mod_python import apache, util, Session
> > 
> > def handler(req):
> > #       req.log_error("in handler")
> > 	global ddcServer
> > 	ddcServer.req = req
> > 	ddcServer.do_GET()
> > 	return apache.OK
> > ...
> > ddcServer = ''
> > if not ddcServer:
> > 	...
> > 	ddcServer = DDCServer(None)	
> > 	ddcServer.captions = DDCCaptions(captionsFile)
> > 	ddcServer.localText = TextLocalization(captionsFile)
> > 	ddcServer.ddcSearch = ddc3.DDCSearch(oclc2ddcFile, recFileName,
> > compFile)
> > 
> > The 'if not ddcServer' code is invoked with every call to the handler.
> > Any ideas what I am doing wrong, or if this is possible with
> mod_python?
> > 
> > 
> > TIA... harry
> > 
> > _______________________________________________
> > Mod_python mailing list
> > Mod_python at modpython.org
> > http://mailman.modpython.org/mailman/listinfo/mod_python
> 
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://mailman.modpython.org/mailman/listinfo/mod_python


More information about the Mod_python mailing list