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
), millegaCondition
loodi.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()