Barrier

Barjäärini jõudnud lõimed pannakse magama teiste järele ootamiseks. Kui Condition on sünkroniseerimiseks kuni ressursi olek on õige, siis Barrier sünkroniseerib tööga jätkamist.

Kaasa saab anda järgi oodatavate lõimede arvu ning sama barjääri saab taaskasutada.

  • Barrier(parties, action=None, timeout=None)
    1. parties – mitu lõime peab barjäärini jõudma.

    2. action – funktsioon, mida üks lõim peab tegema enne kõigi vabastamist.

    3. timeout – ajapiirang wait() meetodile.

action() teise meetodi kutsumiseks:

logging.basicConfig(filename='logging_file.log', level=logging.INFO,format='%(asctime)s [%(levelname)s] %(message)s')
logger = logging.getLogger(__name__)

def barrier_action():
    logger.info("Action triggered")
    # mylib.do_something()
    logger.info("Action completed")

barrier = threading.Barrier(parties=3, action=barrier_action, timeout=5)

def worker():
    barrier.wait()  # 1 lõim pannakse action() argumenti täitma
    logger.info("Passed the barrier")

for _ in range(3):
    threading.Thread(target=worker).start()

Meetodid

  • parties – mitu lõime peab barjäärini jõudma enne jätkamist.

  • n_waiting – mitu lõime hetkel ootab.

  • broken – kas barjäär on katkenud?

  • reset() - barjäär pannakse algolekusse.

  • abort() - Barjääri katkestatakse, kõik olevad ja tulevased wait() kutsed tagastavad erindi.

  • wait() - ootab, kuni ootab konstruktoris määratud lõimede arv.

wait() kutse:

b = Barrier(2)

def worker(name):
    print(f"{name} sees barrier")
    b.wait()
    print(f"{name} passed barrier")

threads = [Thread(target=worker, args=(f"T{i}",)) for i in range(2)]
[t.start() for t in threads]
[t.join() for t in threads]

Kõigile ootavatele lõimedele antakse ühinemisjärjekorras arv 0 kuni ``parties`` -1, niimoodi saab eritoiminguid anda:

i = barrier.wait()
    if i == 0:
        print("First waiter passed the barrier")