如何定期更新对象配置?

时间:2019-01-28 11:36:59

标签: python multithreading

我正在为我们的CRM系统编写一个连接器。 CRM有其自己的配置,我想知道。 CRM是这些配置的唯一信任来源,并通过API提供它们。现在,我将连接器放在python包中作为python类。 CRM配置在 init 上进行了更新,但是,一旦可以从CRM进行更改,我希望它们得到定期更新。有什么好的方法可以在创建对象实例时创建某种任务来执行配置更新?

class Crm:
    def __init__(self, crm_config, mongo_connection_string):
        self.update_crm_configuration()

    def update_crm_configuration(self):
        self.crm_configuration = self.get_crm_configuration_from_crm_api()

    def get_crm_configuration_from_crm_api(self):
        r = self._send_crm_request_wrap(send_request_func=self._send_get_crm_configuration)
        return self._parse_crm_configuration_response(r.text)

现在我一次更新配置,但是我需要定期更新它们。

1 个答案:

答案 0 :(得分:0)

看来最好的方法是不使用具有定期更新的其他线程或任务,而是保存上次更新配置的时间,如果这段时间超出超时,则在实际执行请求之前更新配置。

或者,如果您的API在“配置已更改”方面有很多例外,那么最好在请求重试之前在响应处理程序上执行配置更新。

出于这些目的,我正在使用请求包装器。

    def _send_crm_request_wrap(self, send_request_func, func_params=(),
                               check_crm_configuration=True,
                               retries_limit=None):
        if check_crm_configuration \
                and time.time() - self.last_update_crm_configuration_time > CRM_CONFIGURATION_TIMEOUT:
            self.update_crm_configuration()

        while self.is_crm_locked():
            time.sleep(1000)

        if not self.is_authorized():
            self.auth()

        r = send_request_func(*func_params)
        if retries_limit is None:
            retries_limit = self.max_retries
        retry = 1
        while r.status_code == 205 and retry <= retries_limit:
            waiting_time = randint(1000, 2000)
            logging.info(f'Retry {retry} for {send_request_func.__name__}. Waiting for {waiting_time} sec')
            time.sleep(waiting_time)
            r = send_request_func(*func_params)
            retry += 1

        if r.status_code not in [200]:
            message = f'AMO CRM {send_request_func.__name__} with args={func_params} failed. ' \
                      f'Error: {r.status_code} {r.text}'
            logging.error(message)
            raise ConnectionError(message)

        return r