### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### Семафоры и барьеры

from threading import Thread, BoundedSemaphore, current_thread, Barrier
import time
import random

max_connections = 5
pool = BoundedSemaphore(value=max_connections)

def test():
    with pool:
        slp = random.randint(1, 5)
        print(f"{current_thread().name} - sleep ({slp})")
        time.sleep(slp) 

# for i in range(10):
#     Thread(target=test, name=f'Thr-{i}').start()



### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### Барьеры

def test_barrier(barrier):
    slp = random.randint(3, 7)
    time.sleep(slp)
    print(f"Поток [{current_thread().name}] запущен в ({time.ctime()})")
    
    barrier.wait()
    print(f"Поток [{current_thread().name}] преодолел барьер в ({time.ctime()})")

bar = Barrier(5)
for i in range(5):
    Thread(target=test_barrier, args=(bar, ), name=f"Thread-{i}").start()