import logging from workers.worker import Worker from redlock import RedLock, RedLockError logger = logging.getLogger(__name__) class GlobalWorker(Worker): def __init__(self, app, sleep_period_seconds=3600, lock_ttl=600): super(GlobalWorker, self).__init__() worker_name = self.__class__.__name__ self._redis_info = app.config['USER_EVENTS_REDIS'] self._lock_name = '%s.global_lock' % (worker_name) self._lock_ttl = lock_ttl self.add_operation(self._prepare_global_work, sleep_period_seconds) def _prepare_global_work(self): try: logger.debug('Acquiring lock %s', self._lock_name) with RedLock(self._lock_name, connection_details=[self._redis_info], ttl=self._lock_ttl): logger.debug('Acquired lock %s, performing work', self._lock_name) self.perform_global_work() logger.debug('Work complete, releasing lock %s', self._lock_name) except RedLockError: logger.debug('Could not acquire lock %s, going to sleep', self._lock_name) def perform_global_work(self): raise NotImplementedError('Workers must implement perform_global_work.')