Вот настройки моего кластера:
Код: Выделить всё
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),
}
отчеты - элементы: многие-ко-многим
элементы - попадания: один-ко-многим
Код: Выделить всё
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)
Кроме того, если я запускаю его синхронно, это дает мне правильное количество обращений, но асинхронно приводит к тому, что попадания оказываются больше, чем ожидалось, поскольку Map_reports вызывается слишком много раз.
Я видел похожие проблемы, где решение было чтобы увеличить настройку повтора кластера, но я считаю, что он настроен так, что время ожидания задачи обязательно истечет перед повторной попыткой.
Изменить:
Запуск программы со значительно большим временем повтора решил эту проблему. Как упоминалось в моем комментарии, очередь результатов будет увеличиваться до значительно больших чисел, поэтому задачи будут выполняться, но останутся в очереди результатов, поэтому они будут успешными, но из-за огромного размера очереди результатов блокировка задачи будет превышена, заставляя другого работника взять задачу, даже если она уже выполнена. (Это то, что я сделал в результате экспериментов, поэтому был бы признателен, если бы кто-то более знающий смог это подтвердить).
Подробнее здесь: https://stackoverflow.com/questions/798 ... n-expected
Мобильная версия