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

时间:2015-12-09 18:16:54

标签: python python-2.7 celery celerybeat

The code is here.

我编写了celery.schedules.schedule接口的扩展,我无法弄清楚为什么它在我创建的额外值中没有设置实例化。

当我在传递给app.conf.CELERYBEAT_SCHEDULE之前实例化它们时,它们是正确的。但芹菜击败实例的所有东西都是不正确的。

我在#celery IRC陈问道,我得到的唯一回应是关于懒惰模式,但那是celery.beat.Scheduler,而不是celery.schedules.schedule,所以如果相关,我不明白怎么做。我是否必须扩展它,只是为了正确地实例化日程安排?

我已经尝试用调试器挖掘芹菜代码来弄清楚这些调度实例化的位置,我找不到它。我可以看到他们从Unpickler回来时他们错了,但我找不到他们被创造的地方或他们被腌制的地方。

2 个答案:

答案 0 :(得分:0)

在Python调试器中经过很长时间后,我将问题缩小到celery.beat.PersistentScheduler.sync()和/或shelve.sync()(由前者调用)。

当货架同步时,价值就会丢失。我不知道为什么,但我很确定它是Celery或Shelve中的一个错误。

In any case, I wrote a workaround.

答案 1 :(得分:0)

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)