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
时间: 2024-10-14 20:52:00

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

修改mysql存储引擎备份数据库报错及解决方案

备份数据库报错 原因:由于监控服务器最近cpu负载比较高.(cpu4核心,负载2.7左右)感觉很奇怪,因为别的服务器mysql占用的资源并不多,因此我首先优化了数据库的配置文件.cpu稍微下降了一点,但是没有特别明显的变化. 于是,从mysql的存储引擎和日志考虑,结果发现默认用的引擎是myisam.好吧.换成innodb,(由于事先我没备份,就在配置文件修改了引擎,因为日志除了二进制其他并没有开启.所以没动它.重启数据库. ok 早就听说这两个引擎,区别,看来性能差别真大啊! 好吧.备份数据库

web.py session

web.py session学习: import webfrom web import form urls = ( '/','Index', '/test','Test', '/login','Login', '/logout','Logout',) render = web.template.render(".") allowed = ( ('admin','123123'),) web.config.debug = Falseapp = web.application(urls,

Web.py session用户认证

调试一个用session来认证用户的程序 大概是这个样子 基本上可以当作webpy session认证的示例程序了 #!/usr/bin/env python #coding=utf-8 import web import time urls = ( '/', 'index', '/xml', 'pushxml', '/login', 'login', '/logout', 'logout', ) render = web.template.render('templates/') web.co

部署新浪SAE web.py Session及图片上传等问题注意事项

1.以下几条代码解决编码问题 import sysreload(sys)sys.setdefaultencoding('utf-8') 2.图片上传问题 需要开通sina的Storage服务,随便建个什么Domain,注意HTML代码,那个enctype属性一定要写,两个上传图片的控件叫avatar和photo <form action="details" method="post" enctype="multipart/form-data"

基于php使用memcache存储session的详解(转)

web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内增加一条语句就可以了,不过前提你需要装好memcache模块 1.设置session用memcache来存储方法I: 在 php.ini 中全局设置session.save_handler = memcachesession.save_path = "tcp://127.0.0.1:11211"方法II: 某个目录下的 .h

nginx 负载均衡、用数据库存储Session,来实现多站点共享Session[转]

多站点共享Session常见的作法有: 1.使用.net自动的状态服务(Asp.net State Service); 2.使用.net的Session数据库: 3.使用Memcached. 4.使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下): 这里我们就 演练一下 以数据库的形来存储Session,来实现多站点共享Session. 首先我们 建好一下站点,如下图: Default.aspx 其中 有二个Button  ,SetSession 主要是用于给

session的存储方式和配置

Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.我们控制用户去权限中经常用到Session来存储用户状态,这篇文章会讲下Session的存储方式.在web.config中如何配置Session.Session的生命周期等内容. 1.Session的存储方式. session其实分为客户端Session和服务器端Session. 当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识.SessionID是一个由2

高性能Web服务之Httpd负载均衡Tomcat实现Session Sticky及Session Cluster

Httpd负载均衡Tomcat实现Session Sticky及Session Cluster架构如下所示: 实现过程如下: 配置tomcat服务(tomcat1\tomcat2) (1)安装JDK # rpm -ivh jdk-7u9-linux-x64.rpm  --安装JDK后生成的文件 # cd /usr/java/ ; ll total 4 lrwxrwxrwx  1 root root   16 Sep 27 09:09 default -> /usr/java/latest drw

Memcached 在集群中的 session 共享存储

以下是 PHP Web 环境集群中的 session 共享存储设置: [[email protected] ~]# cat /etc/php.inisession.save_handler = memcache session.save_path = "tcp://192.168.5.131:11211" 配置完在 phpinfo 页面中查看: