gRPC多进程间settings配置实时同步问题及代理方案疑问
gRPC进程间配置同步问题及方案疑问
问题背景
我维护一个gRPC项目,main.py以子进程形式启动gRPC服务器。项目里的settings.py存着配置项,比如:
some_config = {"foo": "bar"}
各个进程的代码里都是通过import settings来读取settings.some_config的值。主进程有个监听器,能按需更新这个配置:
settings.some_config = new_value
但发现主进程修改后,子进程里的some_config还是旧值,没法同步。我需要所有子进程能实时拿到settings.some_config的最新值,而且不用重启服务器。
之前想过用队列/管道传递新值,让子进程监听更新,但不确定能不能行,还担心模块会缓存旧值。
已尝试的方案
我参考Charchit的方案做了调整,代码如下:
from multiprocessing.managers import BaseManager, NamespaceProxy from multiprocessing import Process import settings import time def get_settings(): return settings def run(proxy_settings): settings = proxy_settings # 让模块settings变成代理对象 if __name__ == '__main__': BaseManager.register('get_settings', get_settings, proxytype=NamespaceProxy) manager = BaseManager() manager.start() settings = manager.get_settings() p = Process(target=run, args=(settings, )) p.start()
疑问
- 把整个settings模块设为代理对象合适吗?这是行业标准做法吗?
- 现在是不是settings模块已经变成共享代理对象了?子进程读取
settings.some_config的时候,实际是从manager那边拿最新值? - 这个方案会有哪些副作用?
- 主进程修改settings里的值时,需要加锁吗?
内容的提问来源于stack exchange,提问作者nscode
相关产品推荐
相关产品推荐

