def acquire(self): """Acquire a lock for that task and remove any previous stale lock""" lock = self._getLock() if lock: if lock.updateDate < datetime.now() - 2 * timedelta(seconds=tui.MTIME_POLL_INTERVAL): # Stale lock, removing TaskLock.delete(lock.id) else: raise YokadiException("Task %s is already locked by process %s" % (lock.task.id, lock.pid)) TaskLock(task=self.task, pid=os.getpid(), updateDate=datetime.now())
def acquire(self, pid=None, now=None): """Acquire a lock for that task and remove any previous stale lock""" if now is None: now = datetime.now() if pid is None: pid = os.getpid() lock = self._getLock() if lock: if lock.updateDate < now - 2 * timedelta( seconds=tui.MTIME_POLL_INTERVAL): # Stale lock, reusing it lock.pid = pid lock.updateDate = now else: raise YokadiException( "Task %s is already locked by process %s" % (lock.task.id, lock.pid)) else: # Create a lock self.session.add(TaskLock(task=self.task, pid=pid, updateDate=now)) self.session.commit()
def release(self): """Release the lock for that task""" # Only release our lock lock = self._getLock() if lock and lock.pid == os.getpid(): TaskLock.delete(lock.id)
def _getLock(self): """Retrieve the task lock if it exists (else None)""" try: return TaskLock.select(TaskLock.q.task == self.task).getOne() except SQLObjectNotFound: return None