Python系統實現可插拔python插件?
01-02
似乎不論是GUI還是網頁後端,Python系統跑起來後沒辦法在實現不結束進程前提下再增加自身代碼。
最好是用增加修改自身代碼實現的插件,不是調用其他語言,不是開放api,不是socket。但如果有比較成熟的解決方案也請推薦一下,謝謝!
Python實現這個可能是最容易的了吧,在運行的時候進行import就行了,如果要重新import某個已經載入的庫,可以用reload。一般來說你需要有一個管理介面,可以接受一個Reload的命令,可以是一個API,也可以是SIGHUP之類的信號,當你收到reload信號的時候,就去插件目錄當中檢查每個文件,看是否有修改,如果有修改就reload,如果有新增的就重新import。接下來的難點在於,怎麼讓新載入的代碼無縫地進入到現在正在執行的代碼中。類、函數之類的對象在重新載入之後會成為新的對象,可能需要替換;舊的類可能還有實例沒有用完,這些實例怎麼替換成新的類,或者怎麼讓它能夠跟新的代碼兼容等等。一般來說基於WSGI的web,因為每次調用基本上都是獨立的,可以很容易實現熱載入。其他的就需要做一些額外的設計了。但總體上來說Python對這個問題已經有一個很良好的基礎了。
Python系統跑起來後沒辦法在實現不結束進程前提下再增加自身代碼
先問是不是,估計gunicorn/uwsgi得哭暈在廁所了。。。熱重啟這件事是Web開發的必備好吧,你猜Python有沒有?
微服務、服務發現就更別說了,那是架構層面的可插拔,Python我也是知道怎麼實現的,只是這裡地方太小,寫不下不可以,python並非完整的解釋型語言。
python需要編譯成為機器碼再去運行。我想這個東西應該是動態腳本語言特有的功能了吧,可以實現自身修改自身的代碼,然後隨著源碼的改變,整個邏輯都會隨之改變,你可以在runtiming 的時候導入世界上任意地方的代碼,可以刪除自身的任何部分代碼。
我不知道該怎麼解釋
magic就是無限可能,有些方法說出來太不好了。py本身就有無限可能stevedore,提供drivers,extentions,hooks三種插件載入方式。
python實現這個太容易了吧,之前部門的大三實習生自己就搞定了(一個聊天機器人平台,開發者可以任意上傳.py的插件)。原理就是把代碼寫入文件後reload...
推薦閱讀:
※Django 的最佳開發實踐有哪些?
※python庫Django,Flask各有什麼用途?
※Django 有哪些局限性?
※寫Python的時候,你有哪些奇技淫巧??
※如何將django項目用Nginx部署到伺服器?