Created
October 8, 2019 06:58
-
-
Save cybe/fe0edc27e3a3a4dc8c652425679ec630 to your computer and use it in GitHub Desktop.
This file contains 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
from threading import Lock, Thread | |
from time import sleep | |
import logging | |
logging.basicConfig(level=logging.DEBUG, format='[%(threadName)s] %(message)s') | |
class BackendConnection: | |
_lock = Lock() | |
def __enter__(self): | |
logging.debug('pre acquire lock') | |
self._lock.acquire() | |
logging.debug('post acquire lock') | |
try: | |
sleep(1) | |
raise RuntimeError() | |
except: | |
logging.debug('pre release lock on handling exception') | |
self._lock.release() | |
logging.debug('post release lock on handling exception') | |
raise | |
return True | |
def __exit__(self, exc_type, exc_val, exc_tb): | |
logging.debug('pre cleanup on exit') | |
self._cleanup() | |
logging.debug('post cleanup on exit') | |
def __del__(self): | |
logging.debug('pre cleanup on del') | |
self._cleanup() | |
logging.debug('post cleanup on del') | |
def _cleanup(self): | |
logging.debug('pre release lock on cleanup isLocked()') | |
if BackendConnection._lock.locked(): | |
logging.debug('pre release lock on cleanup isLocked() = True') | |
self._lock.release() | |
logging.debug('post release lock on cleanup isLocked() = True') | |
else: | |
logging.debug('post release lock on cleanup isLocked() = False') | |
logging.debug('post release lock on cleanup') | |
def get(): | |
with BackendConnection(): | |
pass | |
t1 = Thread(name='t1', target=get) | |
t2 = Thread(name='t2', target=get) | |
t1.start() | |
t2.start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment