Beispiel #1
0
    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
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
0
    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