如何避免使用芹菜进行分类副作用?

发布于 2025-02-04 22:07:32 字数 905 浏览 2 评论 0原文

我正在使用芹菜运行一个基于类的应用程序,但是我注意到,当两个过程同时运行时,同类中的某些静态方法并非独立起作用。这是我的SIM应用程序中的应用程序调用

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

,我有一个类方法为我的实例创建ID,如下所示

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

。错误向我表明我的工人不是独立的,并且我的company_id对象不会随着下一个调用从零开始。如何防止此副作用并独立运行每个应用程序?

I am running a class based app using celery, but I am noting that when two processes run simultaneously, certain staticmethods in the class are not acting independently. Here is the app invocation

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

Within my Sim app, I have a class method that creates id's for my instance as follows

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

Usually the first task instantiated will complete successfully, but on the next invocation, I am getting a list index out of range error that suggests to me that my workers are not independent and that my company_id object is not commencing from zero with the next invocation. How can I prevent this side effect and have each app run independently?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一场信仰旅途 2025-02-11 22:07:32

目前,我选择使用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

For now, I have elected to make my process run sequentially using a redis lock:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文