def __init__(self, connection=None, config=None, setup_structlog=False): """ Initializes TaskTiger with the given Redis connection and config options. Optionally sets up structlog. """ self.config = { # String that is used to prefix all Redis keys 'REDIS_PREFIX': 't', # Name of the Python (structlog) logger 'LOGGER_NAME': 'tasktiger', # Where to queue tasks that don't have an explicit queue 'DEFAULT_QUEUE': 'default', # After how many seconds time out on listening on the activity # channel and check for scheduled or expired items. 'SELECT_TIMEOUT': 1, # If this is True, all tasks except future tasks (when=a future # time) will be executed locally by blocking until the task # returns. This is useful for testing purposes. 'ALWAYS_EAGER': False, # If retry is True but no retry_method is specified for a given # task, use the following default method. 'DEFAULT_RETRY_METHOD': fixed(60, 3), # After how many seconds a task that can't require a lock is # retried. 'LOCK_RETRY': 1, # How many items to move at most from the scheduled queue to the # active queue. 'SCHEDULED_TASK_BATCH_SIZE': 1000, # After how many seconds a long-running task is killed. This can be # overridden by the task or at queue time. 'DEFAULT_HARD_TIMEOUT': 300, # The timer specifies how often the worker updates the task's # timestamp in the active queue. Tasks exceeding the timeout value # are requeued. Note that no delay is necessary before the retry # since this condition happens when the worker crashes, and not # when there is an exception in the task itself. 'ACTIVE_TASK_UPDATE_TIMER': 10, 'ACTIVE_TASK_UPDATE_TIMEOUT': 60, 'ACTIVE_TASK_EXPIRED_BATCH_SIZE': 10, # Set up queues that will be processed in batch, i.e. multiple jobs # are taken out of the queue at the same time and passed as a list # to the worker method. Takes a dict where the key represents the # queue name and the value represents the batch size. Note that the # task needs to be declared as batch=True. Also note that any # subqueues will be automatically treated as batch queues, and the # batch value of the most specific subqueue name takes precedence. 'BATCH_QUEUES': {}, } if config: self.config.update(config) self.connection = connection or redis.Redis() self.scripts = RedisScripts(self.connection) if setup_structlog: structlog.configure( processors=[ structlog.stdlib.add_log_level, structlog.stdlib.filter_by_level, structlog.processors.TimeStamper(fmt='iso', utc=True), structlog.processors.StackInfoRenderer(), structlog.processors.format_exc_info, structlog.processors.JSONRenderer() ], context_class=dict, logger_factory=structlog.stdlib.LoggerFactory(), wrapper_class=structlog.stdlib.BoundLogger, cache_logger_on_first_use=True, ) self.log = structlog.get_logger(self.config['LOGGER_NAME'], ).bind() if setup_structlog: self.log.setLevel(logging.DEBUG) logging.basicConfig(format='%(message)s')