Grant nonblocking requests against a fixed permit pool and report the remaining capacity.

Semaphore Capacity Coordination Report

semaphore_capacity_coordination_report.py
import threading


requests = 
permits = threading.Semaphore(3)
granted = 0

for _ in range(requests):
    if permits.acquire(blocking=False):
        granted += 1

available = 3 - granted
status = "full" if available == 0 else "tight" if available <= 1 else "open"

print("requests=" + str(requests) + " granted=" + str(granted) + " available=" + str(available) + " status=" + status)
import threading


requests = 
permits = threading.Semaphore(3)
granted = 0

for _ in range(requests):
    if permits.acquire(blocking=False):
        granted += 1

available = 3 - granted
status = "full" if available == 0 else "tight" if available <= 1 else "open"

print("requests=" + str(requests) + " granted=" + str(granted) + " available=" + str(available) + " status=" + status)
import threading


requests = 
permits = threading.Semaphore(3)
granted = 0

for _ in range(requests):
    if permits.acquire(blocking=False):
        granted += 1

available = 3 - granted
status = "full" if available == 0 else "tight" if available <= 1 else "open"

print("requests=" + str(requests) + " granted=" + str(granted) + " available=" + str(available) + " status=" + status)
semaphore permits A `threading.Semaphore` hands out a bounded number of permits, so the permits still available describe how much shared capacity remains.