import weakref
import threading
def do(l):
l.acquire()
class A:
def __init__(self):
l = threading.Lock()
l.acquire()
t = threading.Thread(target=do, args=[l])
t.start()
weakref.finalize(self, A._finalize, t, l)
@staticmethod
def _finalize(t, l):
print("finalizing")
l.release()
t.join()
a = A()
# del a does trigger _finalize though
aW1wb3J0IHdlYWtyZWYKaW1wb3J0IHRocmVhZGluZwoKCmRlZiBkbyhsKToKICAgIGwuYWNxdWlyZSgpCgoKY2xhc3MgQToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBsID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgIGwuYWNxdWlyZSgpCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWRvLCBhcmdzPVtsXSkKICAgICAgICB0LnN0YXJ0KCkKCiAgICAgICAgd2Vha3JlZi5maW5hbGl6ZShzZWxmLCBBLl9maW5hbGl6ZSwgdCwgbCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2ZpbmFsaXplKHQsIGwpOgogICAgICAgIHByaW50KCJmaW5hbGl6aW5nIikKICAgICAgICBsLnJlbGVhc2UoKQogICAgICAgIHQuam9pbigpCgoKYSA9IEEoKQojIGRlbCBhIGRvZXMgdHJpZ2dlciBfZmluYWxpemUgdGhvdWdo