Esta sincronización se produce porque nos vamos a esperar (dejamos los hilos bloqueados) hasta que haya un número suficiente de hilos o bien alternativamente nos hayamos esperado un determinado tiempo.
En el momento que se desbloquea y se liberan los hilos todos pasan a ejecutarse de forma simultánea. Es decir bien porque hemos llegado al umbral suficiente de hilos o bien porque hayamos llegado al tiempo máximo de espera.
import time
import random
import threading
def f():
time.sleep(random.randint(1,10))
print("{} despertado: {}".format(threading.current_thread().name, time.ctime()))
barrera.wait()
print("{} pasó la barrera: {}\n".format(threading.current_thread().name, time.ctime()))
barrera = threading.Barrier(5)
for _ in range(5):
t = threading.Thread(target=f)
t.start()
Thread-1 (f) despertado: Thu Nov 30 19:25:11 2023 Thread-5 (f) despertado: Thu Nov 30 19:25:12 2023 Thread-4 (f) despertado: Thu Nov 30 19:25:12 2023 Thread-2 (f) despertado: Thu Nov 30 19:25:14 2023 Thread-3 (f) despertado: Thu Nov 30 19:25:16 2023 Thread-3 (f) pasó la barrera: Thu Nov 30 19:25:16 2023 Thread-4 (f) pasó la barrera: Thu Nov 30 19:25:16 2023 Thread-5 (f) pasó la barrera: Thu Nov 30 19:25:16 2023 Thread-2 (f) pasó la barrera: Thu Nov 30 19:25:16 2023 Thread-1 (f) pasó la barrera: Thu Nov 30 19:25:16 2023