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
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))