"""Python daemon boilerplate.""" import signal import sys from sales import config from sales.connectors import loggly from sales.connectors.sentry import sentry_client from sales.constants.exceptions import FailedToStartError from sales.logic.queue import QueueWorkerManager if __name__ == '__main__': current_app_logger = loggly.get_current_logger() manager = QueueWorkerManager( config.QUEUE_READER_THREADS, config.API_EXECUTOR_THREADS, config.SQS_QUEUE_URL, config.PREFETCH_COUNT, config.SQS_MESSAGE_VISIBILITY_TIMEOUT, config.SQS_WAIT_TIME_SECONDS, config.SQS_NUM_MESSAGES, current_app_logger ) manager.debug = config.DEBUG def signal_handler(signum, frame): """Start or stop daemon depending on signal. Use this function for stopping daemon. """ current_app_logger.info('Stopping queue workers and exiting.') manager.stop(config.STOP_TIMEOUT) sys.exit(0) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) try: manager.start() current_app_logger.info('App started.') while True: signal.pause() except FailedToStartError: if sentry_client: sentry_client.captureException() current_app_logger.critical('App failed to start. Exiting..') sys.exit(1) except Exception as e: if sentry_client: sentry_client.captureException() raise e