ivankorobkov / python-inject

Python dependency injection
Apache License 2.0
694 stars 79 forks source link

Hot update configuration is not supported #83

Open 1995chen opened 2 years ago

1995chen commented 2 years ago
def config_changed_handler(entry: Dict[str, Any]) -> Any:
    logger.debug(f"get entry: {entry}")
    old_config: Config = inject.instance(Config)
    # 获取阿波罗实例
    old_apollo_client: ApolloClient = inject.instance(ApolloClient)
    # 重新绑定配置
    inject.clear_and_configure(bind, bind_in_runtime=False)
    # 立即获取apollo实例
    new_apollo_client: ApolloClient = inject.instance(ApolloClient)
    new_config: Config = inject.instance(Config)
    logger.error(
        f"old_config-{id(old_config)} is {old_config}\n"
        f"new_config-{id(new_config)} is {new_config}\n"
        f"old_apollo_client-{id(old_apollo_client)} is {old_apollo_client}\n"
        f"new_apollo_client-{id(new_apollo_client)} is {new_apollo_client}\n"
    )
    # 停止当前线程
    old_apollo_client.stop()

def init_apollo_client() -> ApolloClient:
    from app.handlers.apollo import config_changed_handler

    # 获取阿波罗配置中心的环境变量
    apollo_config: ApolloClient = ApolloClient(
        app_id=Config.APOLLO_APP_ID,
        config_server_url=Config.APOLLO_CONFIG_SERVER_URL
    )
    apollo_config.set_config_changed_handler(config_changed_handler)
    apollo_config.start()
    return apollo_config

i use gunicorn to run the app, i can not get the new instance when inject reconfigure in api