def queue_task(self, task_key, args={}, subtask_key=None): """ Queue a task to be run. All task requests come through this method. It saves their information in the database. If the cluster has idle resources it will start the task immediately, otherwise it will queue the task until it is ready. """ logger.info('Task:%s:%s - Queued: %s' % (task_key, subtask_key, args)) #create a TaskInstance instance and save it task_instance = TaskInstance() task_instance.task_key = task_key task_instance.subtask_key = subtask_key task_instance.args = simplejson.dumps(args) task_instance.save() #queue the task and signal attempt to start it with self._lock_queue: self._queue.append(task_instance) self.advance_queue() return task_instance