首页 > 代码库 > web.py使用session.DiskStore存储session的时候报EOFError异常解决方案

web.py使用session.DiskStore存储session的时候报EOFError异常解决方案

问题原因


 

由于多个线程同时读写session文件导致有线程的行为被拒绝报错,为了避免这种同时性问题,可以加一些延迟,或者每个线程有自己的副本,最后覆盖唯一的session

 

解决方案


 

  1. https://github.com/webpy/webpy/issues/191
  2. https://github.com/webpy/webpy/issues/83

 

方法一:

修改 session.py 里 session.DiskStore的 __setitem__ 方法

def __setitem__(self, key, value):    path = self._get_path(key)    pickled = self.encode(value)    try:        tname = path+"."+threading.current_thread().getName()        f = open(tname, w)        try:            f.write(pickled)        finally:            f.close()            os.rename(tname, path) # atomary operation    except IOError:        pass

 

但是似乎在 win 下 rename 似乎不能直接覆盖目标文件,所以。

方法二:

def __getitem__(self, key):    path = self._get_path(key)    if os.path.exists(path):         while True:            try:                pickled = open(path).read()                return self.decode(pickled)            except EOFError:                time.sleep(0.1)    else:        raise KeyError, key

 

web.py使用session.DiskStore存储session的时候报EOFError异常解决方案