Created
August 19, 2016 00:20
-
-
Save bitterbit/772f4b46337e03dab9be9774ced42006 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| Thread-safe lock mechanism with timeout support module. | |
| """ | |
| from threading import ThreadError, current_thread | |
| from Queue import Queue, Full, Empty | |
| class TimeoutLock(object): | |
| """ | |
| Thread-safe lock mechanism with timeout support. | |
| """ | |
| def __init__(self, mutex=True): | |
| """ | |
| Constructor. | |
| Mutex parameter specifies if the lock should behave like a Mutex, and | |
| thus use the concept of thread ownership. | |
| """ | |
| self._queue = Queue(maxsize=1) | |
| self._owner = None | |
| self._mutex = mutex | |
| def acquire(self, timeout=0): | |
| """ | |
| Acquire the lock. | |
| Returns True if the lock was succesfully acquired, False otherwise. | |
| Timeout: | |
| - < 0 : Wait forever. | |
| - 0 : No wait. | |
| - > 0 : Wait x seconds. | |
| """ | |
| th = current_thread() | |
| try: | |
| self._queue.put( | |
| th, block=(timeout != 0), | |
| timeout=(None if timeout < 0 else timeout) | |
| ) | |
| except Full: | |
| return False | |
| self._owner = th | |
| return True | |
| def release(self): | |
| """ | |
| Release the lock. | |
| If the lock is configured as a Mutex, only the owner thread can release | |
| the lock. If another thread attempts to release the lock a | |
| ThreadException is raised. | |
| """ | |
| th = current_thread() | |
| if self._mutex and th != self._owner: | |
| raise ThreadError('This lock isn\'t owned by this thread.') | |
| self._owner = None | |
| try: | |
| self._queue.get(False) | |
| return True | |
| except Empty: | |
| raise ThreadError('This lock was released already.') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment