標籤:style blog http io color ar os 使用 sp
問題原因
由於多個線程同時讀寫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
web.py使用session.DiskStore儲存session的時候報EOFError異常解決方案