Skip to content

Instantly share code, notes, and snippets.

@cybe
Created October 8, 2019 06:58
Show Gist options
  • Save cybe/fe0edc27e3a3a4dc8c652425679ec630 to your computer and use it in GitHub Desktop.
Save cybe/fe0edc27e3a3a4dc8c652425679ec630 to your computer and use it in GitHub Desktop.
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