Python的reload及熱更新

2021-05-27 11:47:50 字數 1606 閱讀 5804

python的reload及熱更新

horin | [email protected]

blog:

問題 1 浪費了部分記憶體,無所謂,反正記憶體早就是 gb 時代了。問題 2 可以用 import m 方式解決,強迫自己改變編碼風格就可以了,也可以忍受。問題 3 卻是壓死 reload 的最後一根稻草了:物件導向程式設計的核心就是 class,搞不定 class 就沒有 reload!

世界是平的,輪子是圓的。有這麼多 reload 方案存在,我們也就不需要重新造輪子了。只需要挑選乙個合適的實現方案,再結合專案的實際需要進行下加工就可以了。

最常見的情景是:修改了 function/method 的實現、更新了導表資料。把這兩個問題解決,就可以用 20% 的付出,收穫 80% 的回報。鑑於此,我從上述幾個專案中選擇了最簡單的 xreload,其實現思路是:在臨時 namespace 中執行 module,再在原地(in place)對 classes, methods and functions 打 patch。因為是原地打 patch,也就避免了對 class 的例項打 patch,這也是該項目的最大優點。

我對 xreload 模組進行了以下修改:

*增加對 new style class 的支援。

可能是寫的太早的緣故,xreload 僅處理了 classic class,不能處理新式類。

*增加對 module 的可變容器(list,dict,set)的原地更新。

這主要是為了解決導表資料、配置引數的更新。

*增加對 metaclass 的支援。

metaclass 可以把一些複雜應用化繁為簡,應該支援。

*增加對 module 全域性變數的支援。

這主要是為了解決用模組級 global 變數來實現 singleton 模式的更新問題。在 reload 後,會恢復 global 變數。

修改後的 xreload 可以勝任以下應用:

*可以用 module 或者有 '__module__' 屬性的物件來作 reload 的引數。

*可以對 classes, methods and functions 打 patch。

也就是可以支援上述物件的增加、刪除、修改、重新命名。

*支援 classmethod and staticmethod,其他 decorator 不支援。

@2011.08.29

增加對 decorator 等閉包的支援(仍然支援 classmethod and staticmethod)。

因為現在的專案中大量使用了 decorator 等閉包,經過不斷的 google 與試驗,總算解決了這個最大的遺留問題。

*支援 from m import obj 方式,但要求 obj 是可變的,如 class/dict/list 等。

*支援 metaclass。

*支援 module 的 global 變數。

當有需要時,可以增加以下功能:

*自動 reload 有變化的 module。

該功能比較容易實現,只需要定期遍歷各個 module 並比較其時間戳,但因為不大實用,暫不實現。

*增加對 slots 的支援。

我簡單試了下,沒有搞定。因為目前沒有使用,也就不深究了。slots 的好處是省記憶體,在專案中有使用時可以支援。

python使用reload進行熱更新

python2.7 django1.8 ubuntu18.04 因需求定期修改密碼,每次修改完後手動更新配置,重啟服務不現實,本人是在郵件密碼遇見的坑。settings裡的配置通過config.py配置檔案中的conf類動態獲取,conf讀取配置檔案conf.ini中的配置,然後密碼更新後初始化乙個...

Python中的reload函式

python中的import語句可以匯入module檔案,但是import語句只是第一次匯入的時候會執行module檔案中的 然後就會把匯入的模組檔案存入到記憶體,當再次匯入的時候,python是直接從記憶體裡面取出module檔案,而不會執行module檔案的內容了,而reload函式強制pyth...

Python中的reload函式

python中的import語句可以匯入module檔案,但是import語句只是第一次匯入的時候會執行module檔案中的 然後就會把匯入的模組檔案存入到記憶體,當再次匯入的時候,python是直接從記憶體裡面取出module檔案,而不會執行module檔案的內容了,而reload函式強制pyth...