Пример #1
0
    def main(cls, name, loglevel, setup, setupargs, setupkwargs, queue,
             teardown, teardownargs, teardownkwargs):
        from tblib import pickling_support

        cls.name = name
        cls.working = True

        setupargs = setupargs or []
        setupkwargs = setupkwargs or {}

        teardownargs = teardownargs or []
        teardownkwargs = teardownkwargs or {}

        if getattr(signal, 'SIGTERM'):
            signal.signal(signal.SIGTERM, cls.handler)
        if getattr(signal, 'SIGINT'):
            signal.signal(signal.SIGINT, cls.handler)

        logger = logging.getLogger()
        for handler in logger.handlers:
            logger.removeHandler(handler)
        logger.addHandler(cls.LogHandler(queue))
        logger.setLevel(loglevel)

        cls.queue = queue
        queue.send(_State(_State.STARTING))

        with OutputCapture.ReplaceSysStream(
                'stderr', cls.Stream(_Print.stderr,
                                     queue)), OutputCapture.ReplaceSysStream(
                                         'stdout',
                                         cls.Stream(_Print.stdout, queue)):
            try:
                pickling_support.install()
                if setup:
                    setup(*setupargs, **setupkwargs)

                while cls.working:
                    task = queue.receive()
                    if not task:
                        break
                    queue.send(_Result(value=task(None), id=task.id))

            except BaseException:
                typ, exception, traceback = sys.exc_info()
                queue.send(
                    _ChildException(exc_info=(
                        typ,
                        typ('{} (from {})'.format(str(exception), name)),
                        traceback,
                    )))

            finally:
                if teardown:
                    teardown(*teardownargs, **teardownkwargs)
                sys.stdout.flush()
                sys.stderr.flush()
                queue.send(_State(_State.STOPPING))
                cls.queue.close()
                cls.queue = None
Пример #2
0
    def main(cls, name, setup, queue, teardown):
        from tblib import pickling_support

        cls.name = name
        cls.working = True

        if getattr(signal, 'SIGTERM'):
            signal.signal(signal.SIGTERM, cls.handler)

        logger = logging.getLogger()
        for handler in logger.handlers:
            logger.removeHandler(handler)
        logger.addHandler(cls.LogHandler(queue))

        queue.send(State(State.STARTING))

        with OutputCapture.ReplaceSysStream(
                'stderr', cls.Stream(Print.stderr,
                                     queue)), OutputCapture.ReplaceSysStream(
                                         'stdout',
                                         cls.Stream(Print.stdout, queue)):
            try:
                pickling_support.install()
                if setup:
                    setup()

                while cls.working:
                    task = queue.receive()
                    if not task:
                        break
                    queue.send(Result(value=task(None), id=task.id))

            except BaseException:
                typ, exception, traceback = sys.exc_info()
                queue.send(
                    ChildException(exc_info=(
                        typ,
                        typ('{} (from {})'.format(str(exception), name)),
                        traceback,
                    )))

            finally:
                if teardown:
                    teardown()
                sys.stdout.flush()
                sys.stderr.flush()
                queue.send(State(State.STOPPING))