/ / front úloh v zeleri - python, django, zeler

front úloh v zeleri - python, django, zeler

Mám službu, ktorá spracúva údaje. Je napísaný v jazyku Python (Django) a na jeho asynchrónnu použitie používa zeler.

Spracovanie našich údajov využíva kredity. Môžete si tiež kúpiť kredity, čo spúšťa webový háčik Stripe-webhook.

Každá akcia, ktorá zahŕňa zmeny v úveroch, je uvedená ako „práca“. Mám 2 úlohy Celeru, všetky pridávajúce prácu do určitej databázy JobId.

Koncept „práce“ používam na sledovanie toho, ktoré údaje sa pri ktorej práci spracúvajú.

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

Moja súčasná otázka je, že keď ľudia začnúviacerých úloh súčasne, predchádzajúca úloha ešte nie je dokončená. Pretože môj konečný zostatok na kredite ešte nie je známy, nastavil som ho na nulu, aby som teraz zabránil nástupu nových pracovných miest, zatiaľ čo na vykonanie práce môžu zostať kredity.

Podobná situácia sa stane, keď sa pri súčasnom spracovaní úlohy zvýšia kreditné úrovne.

V zásade potrebujem akési riešenie, ktoré umožňuje spúšťať úlohy iba v rovnakom poradí, v akom boli vytvorené a po dokončení predchádzajúcej.

OR

Potrebujem funkciu „kontrola kreditu na úrovni používateľa“ v reálnom čase, ktorá funguje pri bežiacich úlohách, ktoré ešte nie sú dokončené.

Nemôžem to spustiť synchrónne v prostredí Django, pretože môj časový limit je 30 sekúnd, pretože ide o webovú aplikáciu hostenú na heroku.

odpovede:

0 pre odpoveď č. 1

Toto je ťažký problém, pretože Zeler plní úlohysú navrhnuté vopred, aby boli nezávislé od všetkého ostatného. „Zaujímajú sa iba o informácie, ktoré im poskytnete, a nezaujíma ich poradie spracovávanej úlohy. Existuje niekoľko spôsobov, ako to obísť, použitím skupiny a akordy, ale nevidím, ako by vyhovovali vašim potrebám.

Vpredu by som pridal task_id CharField na JobId Model. Keď spustíte úlohu, môžete pre ňu uložiť návratové ID úlohy do db JobId. Preto pre dané ID používateľa môžete skontrolovať stav úloh pre daného používateľa a vrátiť posledný stav kreditu, ak ešte existujú úlohy.