get_or_create и update_or_create сохраняют значения более одного раза, когда выполняется одновременно - PullRequest
0 голосов
/ 22 марта 2020

get_or_create и update_or_create сохраняют значения более одного раза при одновременном выполнении

Я использую djagno2.2 и python3 .5

Мой код выглядит примерно так

class MyClass():

  def func1(arg = None):
    .......very large block of code.........
    This code can take 2-5 minutes to executes.
    .........
    MyModel.objects.get_or_create(name="abcd",defaults={Some params})   
    MyModel1.objects.update_or_create(name="abcd",defaults={Some params})

Я использовал django -celery для фоновых асин c процессов, и вот мой tasks.py файл

    from __future__ import absolute_import, unicode_literals

    from celery.decorators import periodic_task
    from celery.schedules import crontab


    @periodic_task(run_every=crontab(minute=00, hour=00))
    def every_day_midnight():
        """Executes every day at 00:00 am."""

        MyClass().func1()


    @periodic_task(run_every=crontab(minute='*/2'))
    def every_two_minutes():
        """Executes every 2 minutes"""

        MyClass().func1(arg)

Здесь я назвал MyClass (). Func1 () ежедневно в полночь, и одна и та же функция выполняется с аргументом (arg) каждые две минуты.

Теперь моя проблема в том, что обе эти функции выполняются в одно и то же время в полночь, поэтому иногда MyModel и myModel1 сохраняют повторяющиеся значения . пока я использовал get_or_create и update_or_create

   MyModel.objects.get_or_create(name="abcd",defaults={Some params})   

   MyModel1.objects.update_or_create(name="abcd",defaults={Some params})

Эта проблема возникает из-за обоих процессов сельдерея (every_day_midnight (), every_two_minutes ()) выполняется одновременно.

У меня есть пытался с транзакцией .automi c, но это не помогло мне.

Я хочу, когда процесс выполняется MyClass () или MyClass (). func1 другой процесс должен ждать завершения шляпа процесс. Другие идеи / решения также приветствуются

Как я могу это сделать. Заранее спасибо

...