python如何動態的更新引用參數

有配置文件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 模塊,然後根據 模塊.變量名的方式 來寫。

 

發佈了4 篇原創文章 · 獲贊 0 · 訪問量 2164
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章