def get_waiting_tasks(self): """Get all waiting periodic tasks. :returns: list of :class:`celery.models.PeriodicTaskMeta` objects. """ periodic_tasks = tasks.get_all_periodic() db_table = self.model._meta.db_table # Find all periodic tasks to be run. waiting = [] for task_meta in self.all(): if task_meta.name in periodic_tasks: task = periodic_tasks[task_meta.name] run_every = task.run_every if self.is_time(task_meta.last_run_at, run_every): # Get the object again to be sure noone else # has already taken care of it. lock = table_lock.acquire(db_table, "write") try: secure = self.get(pk=task_meta.pk) if self.is_time(secure.last_run_at, run_every): secure.last_run_at = datetime.now() secure.save() waiting.append(secure) finally: lock.release() return waiting
def init_entries(self): """Add entries for all registered periodic tasks. Should be run at worker start. """ periodic_tasks = tasks.get_all_periodic() for task_name in periodic_tasks.keys(): task_meta, created = self.get_or_create(name=task_name)
def init_periodic_tasks(self): """Create collection for periodic tasks in database.""" db = self._get_database() collection = db[self.mongodb_periodictaskmeta_collection] collection.ensure_index("name", pymongo.ASCENDING, unique=True) periodic_tasks = tasks.get_all_periodic() for task_name in periodic_tasks.keys(): if not collection.find_one({"name": task_name}): collection.save({"name": task_name, "last_run_at": datetime.fromtimestamp(0), "total_run_count": 0}, safe=True)
def get_waiting_tasks(self): """Get all waiting periodic tasks. :returns: list of :class:`celery.models.PeriodicTaskMeta` objects. """ periodic_tasks = tasks.get_all_periodic() waiting = [] for task_name, task in periodic_tasks.items(): task_meta, created = self.get_or_create(name=task_name) # task_run.every must be a timedelta object. run_every_drifted = task.run_every + SERVER_DRIFT run_at = task_meta.last_run_at + run_every_drifted if datetime.now() > run_at: waiting.append(task_meta) return waiting
def get_waiting_tasks(self): """Get all waiting periodic tasks. :returns: list of :class:`celery.models.PeriodicTaskMeta` objects. """ periodic_tasks = tasks.get_all_periodic() waiting = [] # XXX This will become a lot of queries. Maybe just only create # the rows at init, and then select all later. for task_name, task in periodic_tasks.items(): task_meta, created = self.get_or_create(name=task_name) # task_run.every must be a timedelta object. run_every_drifted = task.run_every + SERVER_DRIFT run_at = task_meta.last_run_at + run_every_drifted if datetime.now() > run_at: waiting.append(task_meta) return waiting
def _get_waiting_tasks(self): """Get all waiting periodic tasks.""" db = self._get_database() collection = db[self.mongodb_periodictaskmeta_collection] periodic_tasks = tasks.get_all_periodic() # find all periodic tasks to be run waiting = [] for task_meta in collection.find(): if task_meta['name'] in periodic_tasks: task = periodic_tasks[task_meta['name']] run_every = task.run_every if self._is_time(task_meta['last_run_at'], run_every): collection.update( {"name": task_meta['name'], "last_run_at": task_meta['last_run_at']}, {"$set": {"last_run_at": datetime.now()}}) if db.last_status()['updatedExisting']: waiting.append(task_meta) return waiting