Как избежать побочного эффекта при использовании сельдерея?
Я запускаю приложение на основе класса, используя 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