class TOfflineDequeingService(service.Service, RedisMixin): def __init__(self, queue_name, timeout): self.queue = Queue(name=queue_name) self.timeout = timeout self.stopped = False def callback_perform(self, result): if not self.stopped: reactor.callWhenRunning(self.dequeue) def callback_dequeue(self, job): if not job is None: d = threads.deferToThread(job.perform) d.addCallback(self.callback_perform) return d if not self.stopped: reactor.callWhenRunning(self.dequeue) return defer.succeed(None) def dequeue(self): d = self.queue.dequeue(self.timeout) d.addCallback(self.callback_dequeue) def startService(self): reactor.callLater(1, self.dequeue) service.Service.startService(self) def stopService(self): service.Service.stopService(self) self.stopped = False
class TInlineDequeingService(service.Service, RedisMixin): def __init__(self, queue_name, blocking_time): self.queue = Queue(name=queue_name) self.blocking_time = blocking_time self.stopped = False @defer.inlineCallbacks def dequeue(self): while not self.stopped: try: job = yield self.queue.dequeue(self.blocking_time) if not job is None: yield threads.deferToThread(job.perform) except (UnpickleError, NoSuchJobError) as e: log.msg('Exception %s fetching job'%(e.__class__.__name__), e) except Exception as e: log.msg('Exception %s dequeing job %s:'%(e.__class__.__name__, str(job)), e) raise def startService(self): reactor.callLater(1, self.dequeue) service.Service.startService(self) def stopService(self): service.Service.stopService(self) self.stopped = True