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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章