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)