Jelajahi Sumber

Fixes pickle of schedule and ScheduleEntry classes. Closes #1603

Ask Solem 11 tahun lalu
induk
melakukan
2bcbdad59c
2 mengubah file dengan 17 tambahan dan 6 penghapusan
  1. 7 2
      celery/beat.py
  2. 10 4
      celery/schedules.py

+ 7 - 2
celery/beat.py

@@ -89,8 +89,6 @@ class ScheduleEntry(object):
         self.kwargs = kwargs
         self.options = options
         self.schedule = maybe_schedule(schedule, relative, app=self.app)
-        if self.schedule:
-            self.schedule.app = self.app
         self.last_run_at = last_run_at or self._default_now()
         self.total_run_count = total_run_count or 0
 
@@ -107,6 +105,12 @@ class ScheduleEntry(object):
         ))
     __next__ = next = _next_instance  # for 2to3
 
+    def __reduce__(self):
+        return self.__class__, (
+            self.name, self.task, self.last_run_at, self.total_run_count,
+            self.schedule, self.args, self.kwargs, self.options,
+        )
+
     def update(self, other):
         """Update values from another entry.
 
@@ -272,6 +276,7 @@ class Scheduler(object):
 
     def _maybe_entry(self, name, entry):
         if isinstance(entry, self.Entry):
+            entry.app = self.app
             return entry
         return self.Entry(**dict(entry, name=name, app=self.app))
 

+ 10 - 4
celery/schedules.py

@@ -134,6 +134,9 @@ class schedule(object):
     def __ne__(self, other):
         return not self.__eq__(other)
 
+    def __reduce__(self):
+        return self.__class__, (self.run_every, self.relative, self.nowfun)
+
     @property
     def seconds(self):
         return timedelta_seconds(self.run_every)
@@ -577,8 +580,11 @@ class crontab(schedule):
 
 
 def maybe_schedule(s, relative=False, app=None):
-    if isinstance(s, int):
-        s = timedelta(seconds=s)
-    if isinstance(s, timedelta):
-        return schedule(s, relative, app=app)
+    if s is not None:
+        if isinstance(s, int):
+            s = timedelta(seconds=s)
+        if isinstance(s, timedelta):
+            return schedule(s, relative, app=app)
+        else:
+            s.app = app
     return s