Exemple #1
0
def executor(queue,task, out):
    """ the background process """
    logging.debug('    task started')

    class LogOutput(object):
        """Facility to log output at intervals"""
        def __init__(self, out_queue):
            self.out_queue = out_queue
            self.stdout = sys.stdout
            sys.stdout = self
            self.istr = ""
        def __del__(self):
            sys.stdout = self.stdout
        def write(self,data):
            self.out_queue.put(data)
            self.istr += data
        def getvalue(self):
            return self.istr
    
    #stdout, sys.stdout = sys.stdout, cStringIO.StringIO()
    stdout = LogOutput(out)
    try:
        if task.app:
            os.chdir(os.environ['WEB2PY_PATH'])
            from gluon.shell import env, parse_path_info
            from gluon.dal import BaseAdapter
            from gluon import current
            level = logging.getLogger().getEffectiveLevel()
            logging.getLogger().setLevel(logging.WARN)
            # Get controller-specific subdirectory if task.app is of
            # form 'app/controller'
            (a,c,f) = parse_path_info(task.app)
            _env = env(a=a,c=c,import_models=True)
            logging.getLogger().setLevel(level)
            scheduler = current._scheduler
            f = task.function
            functions = current._scheduler.tasks
            if not functions:
                #look into env
                _function = _env.get(f)
            else:
                _function = functions.get(f)
            if not isinstance(_function, CALLABLETYPES):
                raise NameError("name '%s' not found in scheduler's environment" % f)
            globals().update(_env)
            args = loads(task.args)
            vars = loads(task.vars, object_hook=_decode_dict)
            result = dumps(_function(*args,**vars))
        else:
            ### for testing purpose only
            result = eval(task.function)(
                *loads(task.args, object_hook=_decode_dict),
                 **loads(task.vars, object_hook=_decode_dict))
        #stdout, sys.stdout = sys.stdout, stdout
        sys.stdout = stdout.stdout
        queue.put(TaskReport(COMPLETED, result,stdout.getvalue()))
    except BaseException,e:
        sys.stdout = stdout.stdout
        tb = traceback.format_exc()
        queue.put(TaskReport(FAILED,tb=tb, output=stdout.getvalue()))
def executor(queue, task, out):
    """ the background process """
    logger.debug('    task started')

    class LogOutput(object):
        """Facility to log output at intervals"""
        def __init__(self, out_queue):
            self.out_queue = out_queue
            self.stdout = sys.stdout
            sys.stdout = self

        def __del__(self):
            sys.stdout = self.stdout

        def flush(self):
            pass

        def write(self, data):
            self.out_queue.put(data)

    W2P_TASK = Storage({'id': task.task_id, 'uuid': task.uuid})
    stdout = LogOutput(out)
    try:
        if task.app:
            os.chdir(os.environ['WEB2PY_PATH'])
            from gluon.shell import env, parse_path_info
            from gluon import current
            level = logging.getLogger().getEffectiveLevel()
            logging.getLogger().setLevel(logging.WARN)
            # Get controller-specific subdirectory if task.app is of
            # form 'app/controller'
            (a, c, f) = parse_path_info(task.app)
            _env = env(a=a, c=c, import_models=True)
            logging.getLogger().setLevel(level)
            f = task.function
            functions = current._scheduler.tasks
            if not functions:
                #look into env
                _function = _env.get(f)
            else:
                _function = functions.get(f)
            if not isinstance(_function, CALLABLETYPES):
                raise NameError(
                    "name '%s' not found in scheduler's environment" % f)
            #Inject W2P_TASK into environment
            _env.update({'W2P_TASK': W2P_TASK})
            globals().update(_env)
            args = loads(task.args)
            vars = loads(task.vars, object_hook=_decode_dict)
            result = dumps(_function(*args, **vars))
        else:
            ### for testing purpose only
            result = eval(task.function)(*loads(task.args,
                                                object_hook=_decode_dict),
                                         **loads(task.vars,
                                                 object_hook=_decode_dict))
        queue.put(TaskReport(COMPLETED, result=result))
    except BaseException, e:
        tb = traceback.format_exc()
        queue.put(TaskReport(FAILED, tb=tb))
Exemple #3
0
def executor(queue, task, out):
    """ the background process """
    logger.debug("    task started")

    class LogOutput(object):
        """Facility to log output at intervals"""

        def __init__(self, out_queue):
            self.out_queue = out_queue
            self.stdout = sys.stdout
            sys.stdout = self

        def __del__(self):
            sys.stdout = self.stdout

        def flush(self):
            pass

        def write(self, data):
            self.out_queue.put(data)

    W2P_TASK = Storage({"id": task.task_id, "uuid": task.uuid})
    stdout = LogOutput(out)
    try:
        if task.app:
            os.chdir(os.environ["WEB2PY_PATH"])
            from gluon.shell import env, parse_path_info
            from gluon import current

            level = logging.getLogger().getEffectiveLevel()
            logging.getLogger().setLevel(logging.WARN)
            # Get controller-specific subdirectory if task.app is of
            # form 'app/controller'
            (a, c, f) = parse_path_info(task.app)
            _env = env(a=a, c=c, import_models=True)
            logging.getLogger().setLevel(level)
            f = task.function
            functions = current._scheduler.tasks
            if not functions:
                # look into env
                _function = _env.get(f)
            else:
                _function = functions.get(f)
            if not isinstance(_function, CALLABLETYPES):
                raise NameError("name '%s' not found in scheduler's environment" % f)
            # Inject W2P_TASK into environment
            _env.update({"W2P_TASK": W2P_TASK})
            globals().update(_env)
            args = loads(task.args)
            vars = loads(task.vars, object_hook=_decode_dict)
            result = dumps(_function(*args, **vars))
        else:
            ### for testing purpose only
            result = eval(task.function)(
                *loads(task.args, object_hook=_decode_dict), **loads(task.vars, object_hook=_decode_dict)
            )
        queue.put(TaskReport(COMPLETED, result=result))
    except BaseException, e:
        tb = traceback.format_exc()
        queue.put(TaskReport(FAILED, tb=tb))
Exemple #4
0
def executor(queue, task):
    """ the background process """
    logging.debug('    task started')
    stdout, sys.stdout = sys.stdout, cStringIO.StringIO()
    try:
        if task.app:
            os.chdir(os.environ['WEB2PY_PATH'])
            from gluon.shell import env, parse_path_info
            from gluon.dal import BaseAdapter
            from gluon import current
            level = logging.getLogger().getEffectiveLevel()
            logging.getLogger().setLevel(logging.WARN)
            # Get controller-specific subdirectory if task.app is of
            # form 'app/controller'
            (a, c, f) = parse_path_info(task.app)
            _env = env(a=a, c=c, import_models=True)
            logging.getLogger().setLevel(level)
            scheduler = current._scheduler
            f = task.function
            functions = current._scheduler.tasks
            if not functions:
                #look into env
                _function = _env.get(f)
            else:
                _function = functions.get(f)
            if not isinstance(_function, CALLABLETYPES):
                raise NameError(
                    "name '%s' not found in scheduler's environment" % f)
            globals().update(_env)
            args = loads(task.args)
            vars = loads(task.vars, object_hook=_decode_dict)
            result = dumps(_function(*args, **vars))
        else:
            ### for testing purpose only
            result = eval(task.function)(*loads(task.args,
                                                object_hook=_decode_dict),
                                         **loads(task.vars,
                                                 object_hook=_decode_dict))
        stdout, sys.stdout = sys.stdout, stdout
        queue.put(TaskReport(COMPLETED, result, stdout.getvalue()))
    except BaseException, e:
        sys.stdout = stdout
        tb = traceback.format_exc()
        queue.put(TaskReport(FAILED, tb=tb))