Как избежать побочного эффекта при использовании сельдерея?

Я запускаю приложение на основе класса, используя celery, но я заметил, что когда два процесса работают одновременно, некоторые статические методы в классе не действуют независимо. Вот вызов приложения

import os
from PriceOptimization.celery import app
from .Tasks_Sim.sim import Sim, final_report


@app.task(name='Simulations.tasks.scoring')
def simulation(clients, deciles):
   s = Sim(**sim_params)

   market_by_year = s.control_flow(my_save_path)
   report = final_report(market_by_year)
   return report

В моем приложении Sim у меня есть метод класса, который создает идентификаторы для моего экземпляра следующим образом

class Company:
    company_id = 0

    @classmethod
    def set_company_no(cls):
        cls.company_id += 1
        return cls.company_id-1


    def __init__(self, companies, year):
        self._company_id = Company.set_company_no()
        self._company_year = year

Обычно первая инстанцированная задача завершается успешно, но при следующем вызове я получаю ошибку list index out of range error, которая наводит меня на мысль, что мои рабочие не являются независимыми и что мой company_id объект не начинается с нуля при следующем вызове. Как я могу предотвратить этот побочный эффект и добиться независимого запуска каждого приложения?

На данный момент я решил сделать так, чтобы мой процесс выполнялся последовательно, используя блокировку redis:

from settings import REDIS_INSTANCE
REDIS_LOCK_KEY = 'ABC'

@app.task(name='Simulations.tasks.scoring')
def simulation(clients, deciles):

    timeout = (60 * 5)
    have_lock = False
    my_lock = REDIS_INSTANCE.lock(REDIS_LOCK_KEY, timeout=timeout)
    while have_lock == False:
        have_lock = my_lock.acquire(blocking=False)
        if have_lock:
            print('unique process commencing...')
            s = Sim(**sim_params)
            market_by_year = s.control_flow(my_save_path)
            report = final_report(market_by_year)
        else:
            print('waiting for lock to commence...')
            time.sleep(10)
    my_lock.release()
    return report
Вернуться на верх