python web.py 的怪异重加载

Python web.py的怪异重加载

Luo Weifeng 2011-7-10

这个星期天很郁闷的是调bug一直调到现在, 有时候整整一天被一个很奇怪的bug所困扰这,这些问题虽然现在还没有去解释,但是总算也找到了解决的方法,所以就又记录下来了,以备不时之需。

 经过一天的实验和分析,使用web.py的框架时,code.py (主文件)会经常性的重复加载,基本上就是每一次web请求都会重新加载 工程文件,而 每次加载的时候都会执行那些写在 __main__ 外的语句,所以,很多时候,我们希望web应用使用一个公共的服务,由于我说了会有重加载的现象,所以,造成服务被多次初始话或执行,这不仅仅是效率的问题,在有些特定情况下,比如加spin锁的时候就会造成多次加锁,解决的方法现在是摸索到了,就是要不把 所有的global变量都放在__main__的外边让他重新加载,我说过了这个在加锁的应用中几乎不能使用,最好的是把所有的global变量都定义在__main__块中,这里注意是所有,因为如果有一部分变量在外边的时候,会造成重加载的时候 更该 global ()函数的返回值,就会造成在 定义的web 类中找不到 外部变量的错误。 没有说的很清楚,因为这个本身就很糊涂,碰到这个问题的人应该很容易理解我的意思。


后记:
今天终于想通是什么原因了,web.py 默认是使用的debug模式,所以会在程序执行的过程中做reloading,所以就会导致前面我说的情况,解决的方法是,要么:
web.config.debug = False

要么就把需要的变量放在受保护的地方,比如:
if web.config.get('_session') is None:
    session = web.session.Session(app, web.session.DiskStore('sessions'), {'count': 0})
    web.config._session = session
else:
    session = web.config._session



你可能感兴趣的:(Web,框架,session,python,web.py)