Jim Gallacher
jg.lists at sympatico.ca
Tue Oct 18 19:27:39 EDT 2005
Jorey Bump wrote: > Philippe C. Martin wrote: > >> Since I just managed to seg fault apache I feel I should explain what >> my goal is with mod_python. >> >> I already have a fairly big library written in python which purpose is >> to discuss with smart cards but also provide "software" enryption >> capabilites: As such, this library uses modules that in turn talk to C >> code. >> >> The ultimate goal is to have users need to authenticate themselves to >> the servers (on smart card on each side) in order to obtain access to >> certain pages. >> >> I must also say that there is a failry large data set that needs to be >> loaded in memory. > > > Why? > >> The code below shows the line that creates the core dump: it >> instantiates that _large_ object and does a lot in the process. >> >> As I am an application developper more than a web guy, there are >> perhaps some obvious "NO NOs'" I should be aware of that are related >> to the apache environment. >> >> Please note that, although I must have bugs, the code I'm calling >> _seems_ to work flawlessly under Linux and Windows. > > > It might, for a single interpreter. But apache might be forking multiple > children on your system. Can your machine handle 5 or more copies of > this object in memory? > >> from mod_python import apache >> import os >> import sys >> if os.name == 'nt': >> sys.path.append("Z:\\dev") >> else: >> sys.path.append('/home/philippe/dev') >> >> >> from SC.pilot.SC_Script_Processor import * > > > This may happen multiple times. It will be cached in a prefork > environment, but once for each child. I have no idea how it works on > Windows. > >> def world(req): >> ls = SC_Script_Processor() #INSTANTIATE A _BIG_ OBJECT ==> *** >> THIS IS THE KILLER THAT CRASHES APACHE *** > > > How big? If it's a data set, why not use a database? > >> ll = ls.Reader_List() # get the reader list >> >> #Grab ATR from card - assume first reader >> l_appli_conn = ls.Get_Connection(r1) >> req.send_http_header() >> req.write("RETURN CARD ATR= " + l_appli_conn.Get_Connection_ATR() ) >> return apache.OK > > > We need to see your code in the imported module. It's a black box to us. Also, make sure that you consider things like permissions, paths and environment variables. These will be different in mod_python vs the command line. The mod_python interpreter will run with same uid and gid as apache, and your path and environment will be much simpler. Try adding req.write('%s' % os.environ) and compare that with os.environ that you see in the python interpreter run from the command line. Regards, Jim
|