我编写了celery.schedules.schedule
接口的扩展,我无法弄清楚为什么它在我创建的额外值中没有设置实例化。
当我在传递给app.conf.CELERYBEAT_SCHEDULE
之前实例化它们时,它们是正确的。但芹菜击败实例的所有东西都是不正确的。
我在#celery IRC陈问道,我得到的唯一回应是关于懒惰模式,但那是celery.beat.Scheduler
,而不是celery.schedules.schedule
,所以如果相关,我不明白怎么做。我是否必须扩展它,只是为了正确地实例化日程安排?
我已经尝试用调试器挖掘芹菜代码来弄清楚这些调度实例化的位置,我找不到它。我可以看到他们从Unpickler
回来时他们错了,但我找不到他们被创造的地方或他们被腌制的地方。
答案 0 :(得分:0)
在Python调试器中经过很长时间后,我将问题缩小到celery.beat.PersistentScheduler.sync()和/或shelve.sync()(由前者调用)。
当货架同步时,价值就会丢失。我不知道为什么,但我很确定它是Celery或Shelve中的一个错误。
答案 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)