[mod_python] Sessions performance and some numbers

Jim Gallacher jg.lists at sympatico.ca
Thu Apr 7 15:39:56 EDT 2005


Nicolas Lehuen wrote:
> Hi,
> 
> Your code seems perfect to me. We could indeed add an extra hash to
> the directory name so that all sessions do not end in the same
> directory ; but I guess this is not needed on modern FS like ReiserFS
> or WinFS.
> 
> Also, the unlink call in do_delete needs an "os." to be correct...
> 
> If everybody is OK I could integrate your class into the Session.py
> module, so that it becomes a standard session implementation in the
> next release. 

Shouldn't a lock be aquired and released before reading and writing the 
session to a file?

Regards,
Jim

> Grisha, Graham, what do you think ?
> 
> Just as a note, the DbmSession relies on the anydbm module ; maybe the
> crappy performance were due to the fact that anydbm reverted to a
> crappy implementation, not the fastest (?) Berkeley-DB based one.
> 
> Regards,
> 
> Nicolas
> 
> On Apr 7, 2005 5:01 PM, dharana <dharana at dharana.net> wrote:
> 
>>
>>Graham Dumpleton wrote:
>>
>>>On 07/04/2005, at 8:08 PM, dharana wrote:
>>>
>>>
>>>>If you want I can send my modified Session.py with the new FileSession
>>>>class for review.
>>>
>>>
>>>There probably shouldn't have been a need for you to copy/modify the actual
>>>Session.py file which came with mod_python as your derived version could
>>>live quite happily in its own module and simply used the installed Session
>>>module.
>>>
>>
>>I presumptuously thought that it could fit into the official mod_python
>>package due to it's high performance when compared to DbmSession.
>>
>> >
>>
>>>Anyway, by all means post your code as sure it will be of interest to
>>>someone, if not now then maybe in the future. If there are any problems
>>>in what you have done, someone is also bound to point it out.
>>>
>>
>>Here it goes. Please point out any obvious problem. Apart from being new
>>to mod_python I'm also new to Python in general. For example, I don't
>>think the exception handling I've put is completely correct.
>>
>>In anticipation for any possible attachment problems i pasted it
>>directly. (I have read PEP 0008 and the 4 spaces indentation level
>>recommendation but I'm in a hurry right now, sorry.)
>>
>>--- FileSession.py -----------------------------------------------------
>>import cPickle
>>import tempfile
>>
>>from mod_python import Session
>>
>>tempdir = tempfile.gettempdir()
>>
>>class FileSession(Session.BaseSession):
>>
>>   def __init__(self, req, sid=0, secret=None, timeout=0, lock=1):
>>
>>     Session.BaseSession.__init__(self, req, sid=sid, secret=secret,
>>                          timeout=timeout, lock=lock)
>>
>>   def do_cleanup(self):
>>     import os
>>
>>     # is there any faster way of doing this?
>>     for f in os.listdir(tempdir):
>>       if f.find('mp_sess_', 0, 11) == -1:
>>         continue
>>
>>       fp = file('%s%s' % (tempdir, f))
>>       dict = cPickle.load(fp)
>>       fp.close()
>>
>>       if (time() - dict['_accessed']) > dict['_timeout']:
>>         os.unlink('%s%s' % (tempdir, f))
>>
>>   def do_load(self):
>>     try:
>>     # again, is there a more pythonic way of doing this check?
>>       fp = file('%s/mp_sess_%s' % (tempdir, self._sid))
>>     except Exception:
>>       return None
>>     else:
>>       try:
>>         data = cPickle.load(fp)
>>         fp.close()
>>         return data
>>
>>       except Exception:
>>         fp.close()
>>         pass
>>
>>   def do_save(self, dict):
>>     fp = file('%s/mp_sess_%s' % (tempdir, self._sid), 'w+')
>>     cPickle.dump(dict, fp)
>>     fp.close()
>>
>>   def do_delete(self):
>>     try:
>>       unlink('%s/mp_sess_%s' % (tempdir, self._sid))
>>     except Exception:
>>       pass
>>------------------------------------------------------------------------
>>
>>--
>>Juan Alonso
>>http://gamersmafia.com | http://laflecha.net
>>
>>
>>import cPickle
>>import tempfile
>>
>>from mod_python import Session
>>
>>tempdir = tempfile.gettempdir()
>>
>>class FileSession(Session.BaseSession):
>>
>>  def __init__(self, req, sid=0, secret=None, timeout=0, lock=1):
>>
>>    Session.BaseSession.__init__(self, req, sid=sid, secret=secret,
>>                         timeout=timeout, lock=lock)
>>
>>  def do_cleanup(self):
>>    import os
>>
>>    # is there any faster way of doing this?
>>    for f in os.listdir(tempdir):
>>      if f.find('mp_sess_', 0, 11) == -1:
>>        continue
>>
>>      fp = file('%s%s' % (tempdir, f))
>>      dict = cPickle.load(fp)
>>      fp.close()
>>
>>      if (time() - dict['_accessed']) > dict['_timeout']:
>>        os.unlink('%s%s' % (tempdir, f))
>>
>>  def do_load(self):
>>    try:
>>    # again, is there a more pythonic way of doing this check?
>>      fp = file('%s/mp_sess_%s' % (tempdir, self._sid))
>>    except Exception:
>>      return None
>>    else:
>>      try:
>>        data = cPickle.load(fp)
>>        fp.close()
>>        return data
>>
>>      except Exception:
>>        fp.close()
>>        pass
>>
>>  def do_save(self, dict):
>>    fp = file('%s/mp_sess_%s' % (tempdir, self._sid), 'w+')
>>    cPickle.dump(dict, fp)
>>    fp.close()
>>
>>  def do_delete(self):
>>    try:
>>      unlink('%s/mp_sess_%s' % (tempdir, self._sid))
>>    except Exception:
>>      pass
>>
>>
>>_______________________________________________
>>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