Python: threading.Barrier


import threading, time, logging, random

FORMAT = '%(asctime)-15s %(process)d %(lineno)-3s [%(threadName)-11s %(thread)6d] %(message)s'
logging.basicConfig(format=FORMAT, level=logging.DEBUG)


def vacuity(barrier: threading.Barrier):
    logging.info(f'n_waiting = {barrier.n_waiting}')
    try:
        barrier_id = barrier.wait()
        logging.warning(f'barrier id = {barrier_id}')
    except threading.BrokenBarrierError as e:
        logging.error(f'Broken Barrier in {threading.current_thread()}')
        logging.debug(f'BrokenBarrierError = {e}')


barrier = threading.Barrier(3)

for b in range(6):  # revise to 4 5 6
    threading.Thread(name=f'vacuity-{b}', target=vacuity, args=(barrier,)).start()
    threading.Event().wait(1)

三个一波,凑齐运行

import threading, time, logging, random

FORMAT = '%(asctime)-15s %(process)d %(lineno)-3s [%(threadName)-11s %(thread)6d] %(message)s'
logging.basicConfig(format=FORMAT, level=logging.DEBUG)


def vacuity(barrier: threading.Barrier):
    logging.info(f'n_waiting = {barrier.n_waiting}')
    try:
        barrier_id = barrier.wait()
        logging.warning(f'barrier id = {barrier_id}')
    except threading.BrokenBarrierError as e:
        logging.error(f'Broken Barrier in {threading.current_thread()}')
        # logging.debug(f'BrokenBarrierError = {e.args}')


barrier = threading.Barrier(3)

for b in range(9):
    if b == 2:
        barrier.abort()
    elif b == 6:
        barrier.reset()
    threading.Event().wait(1)
    threading.Thread(name=f'vacuity-{b}', target=vacuity, args=(barrier,)).start()

import threading, time, logging, random

FORMAT = '%(asctime)-15s %(process)d %(lineno)-3s [%(threadName)-11s %(thread)6d] %(message)s'
logging.basicConfig(format=FORMAT, level=logging.DEBUG)


def vacuity(barrier: threading.Barrier, i: int):
    logging.error(f'barrier.n_waiting: {barrier.n_waiting}')
    try:
        logging.warning(f'barrier.broken: {barrier.broken}')
        if i < 3:
            barrier_id = barrier.wait(2)  # vacuity-0线程的barrier会等待2s,1-5直接异常
        else:
            if i == 6:
                barrier.reset()
            barrier_id = barrier.wait()
        logging.critical(f'barrier_id: {barrier_id}')
    except threading.BrokenBarrierError:
        logging.warning(f'broken barrier in {threading.current_thread()}')


barrier = threading.Barrier(parties=3)

for b in range(9):
    threading.Thread(name=f'vacuity-{b}', target=vacuity, args=(barrier, b)).start()
    threading.Event().wait(4)