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(vaikimisiRLock), millegaConditionloodi.notify(n=1)- olekut muutev lõim äratab suvalise ootava lõime. Töö jätkamiseks peab ärataja luku vabastama.notify_all()- nagunotify(), aga äratab kõik ootavad lõimed.wait(timeout=None)- luku sees ebasobiva oleku korral teeb lõimwait()kutse. Lõim magab kuni keeginotify()/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)- kutsubwait(), kuni predikaat funktsioon tagastabTrue.
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()