Реализовать с помощью дескрипторов абстракцию «простой семафор», используемую при разделении некроторого ресурса. При обращении к семафору либо происходит захват ресурса (семафор взводится), либо возвращается объект, который этот ресурс захватил. Взведённый семафор может сбросить только объект, который его захватил.
1 a, b = Sem("A"), Sem("B")
2 print("Locked:",a.lock) # A взводит опущенный семафор
3 print("Locked:",a.lock) # Семафор взведён A
4 print("Locked:",b.lock) # Семафор взведён A
5 del(b.lock) # B пытается сбросить семафор
6 print("Locked:",b.lock) # Семафор взведён A
7 print("Locked:",a.lock) # Семафор взведён A
8 del(a.lock) # А сбрасывает семафор
9 print("Locked:",b.lock) # B взводит опущенный семафор
10 print("Locked:",a.lock) # Семафор взведён B
Обратите внимание на то, что семафор взводится объектом O по самому факту обращения объекта к нему.
Locked: None Locked: <A> Locked: <A> Locked: <A> Locked: <A> Locked: None Locked: <B>