Асинхронные задачи Django q2 выполняются больше раз, чем ожидалосьPython

Программы на Python
Ответить
Anonymous
 Асинхронные задачи Django q2 выполняются больше раз, чем ожидалось

Сообщение Anonymous »

У меня возникла проблема с асинхронными задачами: моя функция выполняется несколько раз для одной задачи.
Вот настройки моего кластера:

Код: Выделить всё

Q_CLUSTER = {
'name': 'qcluster',
'workers': 4,
'threads': 1,
'recycle': 500,
'timeout': 30,
'retry': 300,
'max_attempts': 3,
'queue_limit': 8,
'bulk': 1,
'save_limit': 10000,
'orm': 'default',
'sync': bool(IS_TEST),
}
У меня 3 модели. В одном хранятся входящие отчеты, таблица элементов, в которой каждый поступающий отчет классифицируется как экземпляр таблицы элементов, и таблица обращений, в которой записано количество отчетов для этого элемента за каждый день.
отчеты - элементы: многие-ко-многим
элементы - попадания: один-ко-многим

Код: Выделить всё

def map_report(report_id: int) -> str:
"""Map report to item."""
logger.warning('Starting map report: (%s)', report_id)
report = Report.objects.get(pk=report_id)
item = matcher(report)
Hit.increment_item_hits(item=item)
logger.warning('Finished map report: (%s)', report_id)
return f'Item id: {item.pk}'

сопоставитель возвращает либо новый, либо существующий элемент, который сопоставлен с отчетом.
Затем я вызываю это с помощью

Код: Выделить всё

for report in Report.objects.all():
async_task(map_report, report_id=report.pk)
Когда я запускаю это с тестовыми данными из 1000 отчетов, оно работает правильно, однако когда я запускаю его с большим объемом данных, например, 5000 задач, похоже, выполняются несколько раз. Внутри успешных задач выполняется правильное количество задач, но когда я проверяю журналы, он показывает, что Map_reports, похоже, запускается для одной и той же задачи несколько раз, из-за чего мои попадания в конечном итоге превышают ожидаемые.
Кроме того, если я запускаю его синхронно, это дает мне правильное количество обращений, но асинхронно приводит к тому, что попадания оказываются больше, чем ожидалось, поскольку Map_reports вызывается слишком много раз.
Я видел похожие проблемы, где решение было чтобы увеличить настройку повтора кластера, но я считаю, что он настроен так, что время ожидания задачи обязательно истечет перед повторной попыткой.
Изменить:
Запуск программы со значительно большим временем повтора решил эту проблему. Как упоминалось в моем комментарии, очередь результатов будет увеличиваться до значительно больших чисел, поэтому задачи будут выполняться, но останутся в очереди результатов, поэтому они будут успешными, но из-за огромного размера очереди результатов блокировка задачи будет превышена, заставляя другого работника взять задачу, даже если она уже выполнена. (Это то, что я сделал в результате экспериментов, поэтому был бы признателен, если бы кто-то более знающий смог это подтвердить).

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»