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

 

转载于:https://www.cnblogs.com/latyas/p/4096354.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值