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

 

posted @ 2014-11-14 03:41  latyas  阅读(467)  评论(0编辑  收藏  举报