Django сигналы debounce
В проекте, использующем сигналы Django, при выполнении серии UPDATE определенной модели обработка одного SIGNAL оказывается слишком тяжелой и вызывает дискомфорт у пользователя.
Процесс, запускаемый SIGNAL, не нужно выполнять для каждого обновления, если выполняется несколько UPDATE. Например, если UPDATE модели A выполняется 20 раз за одну минуту, нет необходимости запускать сигнал 20 раз.
В свете вышесказанного я думаю, что было бы лучше реализовать что-то вроде debounce, при котором сигнал срабатывает только один раз, даже если в течение одной минуты выполняется несколько UPDATE. (Мы уже предприняли шаги по уменьшению количества условий срабатывания сигнала)
Возможно ли в Django запустить процесс, похожий на debounce? Или есть ли библиотека, которая может это сделать?
Заранее спасибо.
signal.py
@receiver(post_save, sender=ModelA)
def heavy_function1(
sender: ModelA, instance: ModelA, *args, **kwargs
) -> None:
result = calculate1(instance.attribute)
update_modelB(result)
@receiver(post_save, sender=ModelA)
def heavy_function2(
sender: ModelA, instance: ModelA, *args, **kwargs
) -> None:
result = calculate2(instance.attribute)
update_modelB(result)
@receiver(post_save, sender=ModelA)
def heavy_function3(
sender: ModelA, instance: ModelA, *args, **kwargs
) -> None:
result = calculate3(instance.attribute)
update_modelB(result)
Мы уже используем FilldTracker от django-model-util для выполнения тяжелой обработки только при обновлении определенных атрибутов.
model.py
class ModelA(models.Model):
certain_attribute = models.IntegerField()
_tracker = FieldTracker(
fields=['certain_attribute']
)
@property
def is_certain_attribute_changed(self) -> bool:
return self._tracker.has_changed("certain_attribute")
signal.py
@receiver(post_save, sender=ModelA)
def heavy_function1(
sender: ModelA, instance: ModelA, *args, **kwargs
) -> None:
if created or instance.is_certain_attribute_changed:
result = calculate1(instance.attribute)
update_modelB(result)