/ / опашка за задачи в целина - python, django, celery

опашка за задача в целина - python, django, celery

Имам услуга, която обработва данни. Той е написан на Python (Django) и използва Celery, за да го направи асинхронен.

Обработката на нашите данни използва кредити. Можете също така да купувате кредити и това се задейства от Stripe-webhook.

Всяко действие, което включва промени в кредита, е посочено като „работа“. Имам 2 задачи за целина, всички добавящи задача към определена база данни на JobId.

Използвам концепцията „работа“, за да следя кои данни се обработват на коя работа.

models.py:

class JobId(models.Model):
user = models.ForeignKey(User, blank=True, null=True, default=None)
job_time = models.DateTimeField(auto_now_add=True)
# current credit level
credits = models.IntegerField(default=0, null=True, blank=True)
# credit impact / delta of this job
credit_delta = models.IntegerField(default=0, null=True, blank=True)

tasks.py:

task_1_buy_credits(user):
# credit level of user is searched in jobs_database (the users last job)
# adds one line in the JobId database with the users new credit balance


task_2_use_credits(user,data):
# upfront unknown amount of data get processed
# credit level of user is searched in jobs_database (the users last job)
# decide to process job completely or stop if credit level is insufficient

Сегашният ми проблем е, че когато хората започнатняколко задачи наведнъж, предишната работа все още не е завършена. Тъй като окончателният ми кредитен баланс все още не е известен, аз го поставих на нула, за да предотвратя стартирането на нови работни места за сега, докато може да има останали кредити за извършване на работата.

Подобна ситуация се случва, когато нивата на кредитите се увеличават, когато едновременно се обработва работа.

По принцип ми трябва един вид решение, което позволява да изпълнявам задачи само в същия ред, в който са създадени, и след като предишната е завършена.

ИЛИ

Трябва да разполагам в реално време с функцията „проверка на нивото на кредит, свързана с потребителя“, която работи в изпълнени задачи, които все още не са завършени.

Не мога да изпълня този синхрон в моята среда Django, тъй като времето ми за изчакване е 30 секунди поради факта, че това е уеб приложение, хоствано на heroku.

Отговори:

0 за отговор № 1

Това е труден проблем, защото задачите от целинаса проектирани отпред, за да бъдат независими от всичко останало. Те са просто загрижени за информацията, която им предоставяте, и не се интересуват от реда на работата, която се обработва. Има няколко начина, по които можете да заобиколите това, като използвате групи и акорди, но не виждам как биха отговаряли на вашите нужди.

Отпред бих добавил task_id CharField да се JobId модел. Когато стартирате задача, можете да съхраните връщащия се идентификатор на задача в db за това JobId, Следователно за даден потребителски идентификационен номер можете да проверите състоянието на заданията за този потребител и да върнете най-новото състояние на кредит, ако все още има чакащи задания.