有配置文件config.ini,裏面記錄了程序運行的參數,因爲處於調試,這些參數可能是需要改變的,如何在不需要重啓程序的情況下使得配置的更改能在線生效呢?
目前測試有兩種方法:
方法1:使用reload
config.ini
[server]
interval = 3
args_parser.py
import configparser
# 全局變量
config_file = "config.ini"
def read_config(config_file_name):
config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
config.read(config_file_name)
return config
config = read_config(config_file)
test.py
import time
import os
from datetime import datetime
import args_parser
while 1:
reload(args_parser)
d = datetime.now()
config = args_parser.config
v = config['server']['interval']
print "%s :: %s" % (d, v)
time.sleep(1)
這種方法的問題是,每次循環都要reload一下,自然影響機器開銷不說,看着心裏也不爽。
因此考慮把reload單獨放到外面:
加入中間處理程序args_reloader.py。
import args_parser
from decorators import run_period, wrap_threading
@wrap_threading
@run_period(interval=10)
def reload_args():
print("reload args")
reload(args_parser)
reload_args()
# 用來對比
config = args_aprser.config
其中wrap_threading表示這個程序用單獨一個線程跑,run_period表示每個一段時間這個程序跑一次。這兩個組合就是開啓一個新線程,這個線程是每個一段時間跑一下程序。
test.py更改爲:
import time
import os
from datetime import datetime
#from args_parser import config
import args_reloader
while 1:
d = datetime.now()
config = args_reloader.args_parser.config
v = config['server']['interval']
print "%s :: %s" % (d, v)
time.sleep(1)
其中config,必須這樣串行寫,因爲reload其實更改了args_parser裏面的東西,所以這樣寫是有效的,寫成args_reloader.config指向的還是第一次讀取的config。
方法2:
方法1不管怎麼看,都是很麻煩的方式,先不說寫法麻煩,而且強耦合。
所以自然有第二種寫法,本質在於python的一個模塊就是一個單例模式。
import args_parser
from decorators import run_period, wrap_threading
import configparser
# 全局變量
config_file = "config.ini"
config = None
@wrap_threading
@run_period(interval=10)
def read_config_dyn():
print("read config")
args_parser.config = read_config(config_file)
def read_config(config_file_name):
config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
config.read(config_file_name)
return config
test.py:
import time
import os
from datetime import datetime
import args_parser
from args_parser_updater import read_config_dyn
read_config_dyn()
while 1:
#reload(args_parser)
d = datetime.now()
config = args_parser.config
v = config['server']['interval']
print "%s :: %s" % (d, v)
time.sleep(1)
重點在於:
from args_parser_updater import read_config_dyn
read_config_dyn()
可以看出,這種寫法很簡單,同時也和模塊鬆耦合,實際在開發中需要單獨加個中間模塊來保存更新的參數,程序的其他部分都從中間模塊中讀取參數。
所以在寫程序的時候,模塊級別的變量輸入,最好寫法是 import 模塊,然後根據 模塊.變量名的方式 來寫。