<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網 大學生計算機學習社區

    CowNew開源團隊

    http://www.cownew.com 郵件請聯系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    Python 的模塊一旦加載就會常駐內存,直到程序結束。再碰到 import 語句式只是修改名字空間,而不需要重新加載。這種機制是出于運行時的效率考慮,每遇到 import 的時候重新加載顯然很低效。它也不會檢查源文件的修改時間以確定是否重新加載,Python 有那么多的模塊,每次調用時都檢查一遍時間也是不行的。

    這種機制下,開發長時間運行的守護程序就會很麻煩,修改源代碼后要重新啟動程序才能讓新的代碼生效。比如用 mod_python 做 web 開發,Apache 會啟動多個守護進程來應答客戶請求,里面有 python 的解釋引擎和加載的模塊,若要讓修改后的代碼生效只能重起 apache,這會影響到其它服務的正常運行,非常不方便。mod_python 有一個PythonAutoReload 參數,它只是針對 PythonHandler 而言的,能夠對設定的 PythonHandler 實現自動重新加載,而該 Handler 中所用到的模塊卻不能自動 reload。

    這種修改源代碼然后重起 apache 的調試方式實在讓我無法忍受了,決定實現一種自動重新加載機制?;镜乃悸肪褪敲總€用戶請求到來時,檢查我所關心的那些模塊源文件的修改時間,如果比加載時的修改時間新,則重新加載。

    編寫一個檢測時間和重新加載的函數,讓它在每個請求到來時執行:

    1. def ?autoreload(): ??
    2. ??mod_names?=?['Entry','Index','SideBar'] ??
    3. ?? for ?mod_name? in ?mod_names: ??
    4. ???? try : ??
    5. ??????module?=? sys .modules[?mod_name?] ??
    6. ???? except : ??
    7. ?????? continue ??
    8. ????mtime?=? os .path.getmtime(?module.__file__?) ??
    9. ???? try : ??
    10. ?????? if ?mtime?>?module.loadtime: ??
    11. ???????? reload (?module?) ??
    12. ???? except : ??
    13. ???? pass ??
    14. ????module.loadtime?=?mtime ??

    這段代碼不長,但是改了好多個版本,最開始用 has_key() 的方式來檢測是否存在某個模塊,檢測該模塊是否有 loadtime 屬性( 用 module.__dict__ ),現在這種方式應該效率高一些,曾經在一個 blog 上看到過對比測試數據。起初還在每個關心的模塊里面加上一句loadtime = os.path.getmtime( __file__ ),這是不必要的,因為 Python 用的是動態類型,可以在運行時追加屬性,第一次檢測時設置初始狀態即可。

    有了這段代碼,開發 BlogXP 方便多了,改了源碼之后立馬就能生效,而且它在正常運行時的消耗也很小。另外,由于mod_python 能夠實現指定的 Handler 的自動重新加載,將這段代碼放在該 Handler 中,可以方便地改變所關心的模塊列表,也不需重起 apache。

    歡迎批評指正:-)
    from: http://blog.daviesliu.net/article/entry20050610-235635

    posted on 2007-03-12 14:57 CowNew開源團隊 閱讀(1738) 評論(2)  編輯  收藏

    評論

    # re: Python Module Auto Reload [未登錄] 2007-09-11 11:54 呵呵
    有點多余,

    mod_python.module_import() 就可以 autoreload.
    handler 也可以 autoreload 的  回復  更多評論
      

    # re: Python Module Auto Reload [未登錄] 2009-03-18 18:42 joyce
    如果要reload關心的模塊, 但此時這個模塊現在正為其他請求服務呢, 你仍然要reload就會中斷正在服務的進程。
      回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 日本v片免费一区二区三区| 免费精品国产自产拍在| 亚洲乱码中文字幕综合234| 亚洲精品9999久久久久无码| 99在线视频免费观看视频| 亚洲一级视频在线观看| 精品国产sm捆绑最大网免费站| 亚洲宅男永久在线| 麻豆视频免费观看| 亚洲av无码片区一区二区三区| 无码国产精品一区二区免费模式| 无码专区—VA亚洲V天堂| 久久99热精品免费观看牛牛| 久久精品国产亚洲av日韩| 真人做A免费观看| 亚洲另类无码专区丝袜| 亚洲国产主播精品极品网红| 成人毛片100免费观看| 亚洲天天做日日做天天欢毛片| 免费人成在线观看69式小视频| 亚洲中文字幕精品久久| 免费a级毛片在线观看| 国产免费播放一区二区| 亚洲男人的天堂在线播放| 欧洲精品成人免费视频在线观看| AV激情亚洲男人的天堂国语| 久久久久久久亚洲精品| free哆啪啪免费永久| 亚洲av无码专区国产不乱码| 国产成人综合亚洲亚洲国产第一页 | 亚洲精品色播一区二区| 亚洲AV成人精品日韩一区18p| 久久精品免费一区二区三区| 亚洲av极品无码专区在线观看 | 亚洲精品自在在线观看| 久久久久久免费视频| 人人鲁免费播放视频人人香蕉| 久久精品亚洲日本佐佐木明希| 在线免费观看a级片| 两个人看的www免费| 亚洲色无码专区一区|