扩展芹菜.schedules.schedule对象不会被传递额外的参数

2024-06-28 14:49:55 发布

您现在位置:Python中文网/ 问答频道 /正文

The code is here.

我编写了celery.schedules.schedule接口的扩展,我不明白为什么在我创建的额外值中没有设置任何东西来实例化它。你知道吗

当我在传递给app.conf.CELERYBEAT_SCHEDULE之前实例化它们时,它们是正确的。但是芹菜节拍实例化的那些都是不正确的。你知道吗

我在西芹IRC chan上问过,我得到的唯一回答是关于懒惰模式,但那是针对celery.beat.Scheduler,而不是celery.schedules.schedule,所以如果这是相关的,我不明白怎么做。我是否也必须扩展它,以便它正确地实例化计划?你知道吗

我试着用调试器挖掘芹菜代码,找出这些调度在哪里被实例化,但我找不到它。当他们从Unpickler回来时,我可以看出他们错了,但我找不到他们是在哪里被创造出来的,也找不到他们是在哪里被腌制出来的。你知道吗


Tags: the实例apphereisconfirccode
2条回答

在Python调试器中使用了很多时间之后,我将问题缩小到芹菜.节拍.PersistentScheduler.sync()和/或搁置.sync()(前者称之为)。你知道吗

同步搁置时,值将丢失。我不知道为什么,但我很肯定这是芹菜或架子上的虫子。你知道吗

In any case, I wrote a workaround.

celery.schedules.schedule有一个__reduce__方法,用于定义如何使用pickle序列化和重构对象:

https://github.com/celery/celery/blob/master/celery/schedules.py#L150-L151

pickle序列化将调用的对象时:

fun, args = obj.__reduce__()

当它重建物体时,它会做:

obj = fun(*args)

因此,如果您已将新状态添加到自定义计划子类中,并作为参数传递给__init__,那么您将 还必须定义一个__reduce__方法来接受这些 要考虑的新参数:

class myschedule(schedule):

    def __init__(self, run_every=None, relative=False, nowfun=None,
                 odds=None, max_run_every=None, **kwargs):
        super(myschedule, self).__init__(
            run_every, relative, nowfun, **kwargs)
        self.odds = odds
        self.max_run_every = max_run_every

    def __reduce__(self):
        return self.__class__, (
            self.run_every, self.relative, self.nowfun,
            self.odds, self.max_run_every)

相关问题 更多 >