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)
Вернуться на верх