def run_at(self): run_at = self._run_at or datetime_now() if isinstance(run_at, int): run_at = datetime_now() + timedelta(seconds=run_at) if isinstance(run_at, timedelta): run_at = datetime_now() + run_at return run_at
def schedule(self, task_name, args, kwargs, run_at=None, priority=0, action=TaskSchedule.SCHEDULE): '''Simply create a task object in the database''' task = Task.objects.new_task(task_name, args, kwargs, run_at, priority) if action != TaskSchedule.SCHEDULE: task_hash = task.task_hash unlocked = Task.objects.unlocked(datetime_now()) existing = unlocked.filter(task_hash=task_hash) if action == TaskSchedule.RESCHEDULE_EXISTING: updated = existing.update(run_at=run_at, priority=priority) if updated: return elif action == TaskSchedule.CHECK_EXISTING: if existing.count(): return task.save()
def run_task(self, tasks, task): try: logging.info('Running %s', task) args, kwargs = task.params() tasks.run_task(task.task_name, args, kwargs) # task done, so can delete it completed = CompletedTask(task_name=task.task_name, task_params=task.task_params, task_hash=task.task_hash, priority=task.priority, run_at=datetime_now(), attempts=task.attempts, failed_at=task.failed_at, last_error=task.last_error, locked_by=task.locked_by, locked_at=task.locked_at) completed.save() task.delete() logging.info('Ran task and deleting %s', task) except Exception: t, e, traceback = sys.exc_info() logging.warn('Rescheduling %s', task, exc_info=(t, e, traceback)) task.reschedule(t, e, traceback) del traceback