您的位置:首页 > Web前端

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

2014-11-14 03:41 369 查看
问题原因

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

解决方案
https://github.com/webpy/webpy/issues/191 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: