def _run_task(self, key, version, task_class, module_search_path, args={},
            subtask_key=None, workunit=None, main_worker=None, task_id=None,
            callback=None):
        """
        Runs a task on this worker
        
        @param key - key identifying task to run
        @param version - version of task to run.
        @param task_class - class instance of the task
        @param module_search_path - ????????????????
        @param args - kwargs that will be passed to the Task.start()
        @param subtask_key - key identifying subtask to run
        @param workunit - key to data, or data to processed
        @param main_worker - key for the main worker of this task
        @param task_id - ID of the task instance
        """
        logger.info('RunTask:  key=%s  args=%s  sub=%s  w=%s  main=%s' \
            % (key, '--', subtask_key, workunit, main_worker))
        # Register task with worker
        with self._lock:
            if not key:
                return "FAILURE: NO TASK KEY SPECIFIED"
            # save what worker is running
            self._task = key
            self._subtask = subtask_key

        # If args is a string, it may be unicode instead of str. This is a
        # Django issue. Try to make everybody happy by treating the string as
        # JSON.

        # This is almost certainly the wrong thing to do, but it's historical.
        try:
            clean_args = dict(
                    (str(k), v) for k, v in
                    simplejson.loads(args).iteritems()
            )
        except:
            clean_args = args

        # only create a new task instance if this is the root task.  Otherwise
        # subtasks will be created within the structure of the task.
        if not self._task_instance:
            self._task_instance = task_class()
            self._task_instance.parent = self
            if not subtask_key:
                self._task_instance.logger = get_task_logger(self.worker_key, \
                                                                task_id)

        # start the task.  If this is actually a subtask, then the task is
        # responsible for starting the subtask instead of the main task
        return self._task_instance.start(clean_args, subtask_key, workunit,
                        task_id, \
                        callback=callback,
                        callback_args = {'workunit':workunit},
                        errback=callback,
                        errback_args={'workunit':workunit, 'failed':True})
    def _run_task(self, key, version, task_class, module_search_path, args={},
            subtask_key=None, workunit=None, main_worker=None, task_id=None,
            callback=None):
        """
        Runs a task on this worker
        
        @param key - key identifying task to run
        @param version - version of task to run.
        @param task_class - class instance of the task
        @param module_search_path - ????????????????
        @param args - kwargs that will be passed to the Task.start()
        @param subtask_key - key identifying subtask to run
        @param workunit - key to data, or data to processed
        @param main_worker - key for the main worker of this task
        @param task_id - ID of the task instance
        """
        logger.info('RunTask:  key=%s  args=%s  sub=%s  w=%s  main=%s' \
            % (key, '--', subtask_key, workunit, main_worker))

        # Register task with worker
        with self._lock:
            if not key:
                return "FAILURE: NO TASK KEY SPECIFIED"
            # save what worker is running
            self.__task = key
            self.__subtask = subtask_key

        # process args to make sure they are no longer unicode.  This is an
        # issue with the args coming through the django frontend.
        clean_args = {}
        args = simplejson.loads(args)
        if args:
            for arg_key, arg_value in args.items():
                clean_args[arg_key.__str__()] = arg_value

        # only create a new task instance if this is the root task.  Otherwise
        # subtasks will be created within the structure of the task.
        if not self.__task_instance:
            self.__task_instance = task_class()
            self.__task_instance.parent = self
            if not subtask_key:
                self.__task_instance.logger = get_task_logger(self.worker_key, \
                                                                task_id)

        # start the task.  If this is actually a subtask, then the task is
        # responsible for starting the subtask instead of the main task
        return self.__task_instance.start(clean_args, subtask_key, workunit,
                        task_id, \
                        callback=callback,
                        callback_args = {'workunit':workunit},
                        errback=callback,
                        errback_args={'workunit':workunit, 'failed':True})