Condition

Lõimede sünkroniseerimiseks. Kui lõimed vajavad ressursi vaid teatud olekus, siis condition laseb lõimedel magada kuni muu lõim ressursi tahetud seisu viib.

Näiteks mängijad arvutimängus ootavad "lobby's", kuni mäng käivitatakse. Samal ajal võidakse laadida kaarte, avatare, muusikat ja muud. Alles siis saavad mängijad mängima hakata.

Condition sees on vaja kontrollida while-tsükliga ressursi olekut spurious wakeup tõttu. See on olukord, kus magav lõim ärkab vale notify() kutse peale.

Meetodid

  • acquire(*args) / release() - paneb/vabastab luku(vaikimisi RLock), millega Condition loodi.

  • notify(n=1) - olekut muutev lõim äratab suvalise ootava lõime. Töö jätkamiseks peab ärataja luku vabastama.

  • notify_all() - nagu notify(), aga äratab kõik ootavad lõimed.

  • wait(timeout=None) - luku sees ebasobiva oleku korral teeb lõim wait() kutse. Lõim magab kuni keegi notify() / notify_all() kutse teeb.

wait() kasutus:

condition = threading.Condition()
items = []

def consumer():
    with condition:
        while not items:
            condition.wait()
        print("I consumed item:", items.pop())

def producer():
    with condition:
        items.append(42)
        condition.notify()

t1 = threading.Thread(target=consumer)
t2 = threading.Thread(target=producer)

t1.start()
t2.start()
t1.join()
t2.join()
  • wait_for(predicate, timeout=None) - kutsub wait(), kuni predikaat funktsioon tagastab True.

wait_for() boolean väärtusega predikaadile:

with cv:
    cv.wait_for(an_item_is_available)
    get_an_available_item()

Analoogne näide:

while not predicate():
    condition.wait()