def hello():
print "Hello, world!"
t = Timer(30.0, hello)
t.start()
ΠΠ°ΠΌΠΊΠΈ
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ Π·Π°ΠΌΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ»Π°ΡΡΠ° Lock ΠΌΠΎΠ΄ΡΠ»Ρ threading. ΠΠ°ΠΌΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ»ΠΈ ΠΎΡΠΊΡΡΡ, ΠΈΠ»ΠΈ Π·Π°ΠΏΠ΅ΡΡ. Π ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠΌ Π²Π»Π°Π΄Π΅Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Lock ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ:
β’ acquire([blocking=True]) ΠΠ΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° Π·Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°ΠΌΠΊΠ°. ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ blocking Π½Π΅ ΡΠΊΠ°Π·Π°Π½ ΠΈΠ»ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΡΠΈΠ½ΠΎΠΉ, ΡΠΎ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π·Π°ΠΌΠΊΠ°. ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π½Π΅ Π±ΡΠ» Π·Π°Π΄Π°Π½, ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ blocking Π±ΡΠ» Π·Π°Π΄Π°Π½ ΠΈ ΠΈΡΡΠΈΠ½Π΅Π½, ΠΌΠ΅ΡΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ True (ΠΏΠΎΡΠ»Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ²Π»Π°Π΄Π΅Π½ΠΈΡ Π·Π°ΠΌΠΊΠΎΠΌ). ΠΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ (ΡΠΎ Π΅ΡΡΡ Π·Π°Π΄Π°Π½ blocking=False), ΠΌΠ΅ΡΠΎΠ΄ Π²Π΅ΡΠ½Π΅Ρ True, Π΅ΡΠ»ΠΈ Π·Π°ΠΌΠΎΠΊ Π½Π΅ Π±ΡΠ» Π·Π°ΠΏΠ΅ΡΡ ΠΈ ΠΈΠΌ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΠ²Π»Π°Π΄Π΅Π» Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΎ False.
β’ release() ΠΠ°ΠΏΡΠΎΡ Π½Π° ΠΎΡΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°ΠΌΠΊΠ°.
β’ locked() ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π·Π°ΠΌΠΊΠ° (True β Π·Π°ΠΏΠ΅ΡΡ, False β ΠΎΡΠΊΡΡΡ). Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π·Π°ΠΌΠΊΠ° ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ, ΡΡΠΎ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ ΡΠΎΡ ΡΠ°Π½ΠΈΡ ΡΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
ΠΠΌΠ΅Π΅ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ Π·Π°ΠΌΠΊΠ° β threading.RLock, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ threading.Lock ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·. ΠΡΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°ΠΊΠΎΠ³ΠΎ Π·Π°ΠΌΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ ΠΆΠ΅ ΡΠ°Π·, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΠ»ΠΎ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈΠΉ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π½ΡΡΡΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½Ρ Π·Π°ΠΌΠΊΠΈ?ΠΠ°ΠΌΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡ Π²Ρ ΠΎΠ΄ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. ΠΠ°ΠΌΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΡΠ°Π·Ρ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΈΡΠΊΠΎΠ² ΠΈΠ»ΠΈ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ, ΡΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΡΠ°Π²ΠΈΡΡ Π·Π°ΠΌΠΊΠ°ΠΌΠΈ. ΠΠΎΠΊΡΡΠ³ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ (ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎβΡΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° Python) Π·Π°ΠΌΠΊΠΈ ΡΡΠ°Π²ΠΈΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΠΎΠ΄ append() (Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ) ΡΠΏΠΈΡΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ, Π° ΡΠΎΡ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ. Π ΡΠ»ΡΡΠ°Π΅ ΡΠΎΠΌΠ½Π΅Π½ΠΈΠΉ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π»ΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Ρ ΠΎΠ²Π°ΡΡΡΡ ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π°ΠΌΠΊΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π·Π°ΠΌΠΊΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π·Π°ΠΌΠΎΠΊ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΏΡΡΠ°ΡΡΠΈΠ΅ΡΡ ΠΏΠΎΠΏΠ°ΡΡΡ Π² ΡΡ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π·Π°ΠΌΠΊΠ° Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΉ Π½Π°Π΄ ΠΎΠ±ΡΠΈΠΌΠΈ Π΄Π»Ρ Π΄Π²ΡΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ, ΡΡΡΠ΄Π½ΠΎΡΠ»ΠΎΠ²ΠΈΠΌΡΠΌ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ.
Π’ΡΠΏΠΈΠΊΠΎΠ²Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ (deadlock)ΠΠ°ΠΌΠΊΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΡΠ΅ΡΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠ°ΠΊΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ. ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π·Π°ΠΌΠΊΠ°ΠΌΠΈ Π²Π°ΠΆΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ ΠΏΡΠΎΠ΄ΡΠΌΠ°ΡΡ, Π½Π΅ Π·Π°ΠΉΠ΄Π΅Ρ Π»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΡΠΏΠΈΠΊ (deadlock) ΠΈΠ·βΠ·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΄Π²ΡΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ ΡΠ΅ΡΡΡΡΡ, Π½ΠΎ Π½ΠΈ ΡΠΎΡ, Π½ΠΈ Π΄ΡΡΠ³ΠΎΠΉ Π½Π΅ ΡΠΌΠΎΠ³ΡΡ ΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π·Π°ΠΌΠΊΠΈ. Π’Π°ΠΊΠ°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π° Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
import threading, time
resource = {'A': threading.Lock(), 'B': threading.Lock()}
def proc(n, rs):
for r in rs:
print "ΠΡΠΎΡΠ΅ΡΡ %s Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΡΡΡ %s" % (n, r)
resource[r].acquire()
print "ΠΡΠΎΡΠ΅ΡΡ %s ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠ΅ΡΡΡΡ %s" % (n, r)
time.sleep(1)
print "ΠΡΠΎΡΠ΅ΡΡ %s Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ" % n
for r in rs:
resource[r].release()
print "ΠΡΠΎΡΠ΅ΡΡ %s Π·Π°ΠΊΠΎΠ½ΡΠΈΠ» Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅" % n
p1 = threading.Thread(target=proc, name="t1", args=["1", "AB"])
p2 = threading.Thread(target=proc, name="t2", args=["2", "BA"])
p1.start()
p2.start()
p1.join()
p2.join()
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° (t1 ΠΈ t2) Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π·Π°ΠΌΠΊΠΈ ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ΅ΡΡΡΡΠ°ΠΌ (A ΠΈ B), Π½ΠΎ Π² ΡΠ°Π·Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΎΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π½ΠΈ Ρ ΡΠΎΠ³ΠΎ, Π½ΠΈ Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΡΠ΅ΡΡΡΡΠΎΠ² Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ, ΠΈ ΠΎΠ½ΠΈ ΠΎΠ±Π° Π±Π΅Π·Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΏΠΎΠ²ΠΈΡΠ°ΡΡ, ΠΎΠΆΠΈΠ΄Π°Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ°. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌ print ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ:
ΠΡΠΎΡΠ΅ΡΡ 1 Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΡΡΡ A
ΠΡΠΎΡΠ΅ΡΡ 1 ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠ΅ΡΡΡΡ A
ΠΡΠΎΡΠ΅ΡΡ 2 Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΡΡΡ B
ΠΡΠΎΡΠ΅ΡΡ 2 ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠ΅ΡΡΡΡ B
ΠΡΠΎΡΠ΅ΡΡ 1 Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΡΡΡ B
ΠΡΠΎΡΠ΅ΡΡ 2 Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΡΡΡ A
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΡΠΏΠΈΠΊΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠ°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ Π»Π΅ΠΊΡΠΈΠΈ. ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΎΠ²Π΅ΡΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠΈΠ΅ΠΌΡ:
β’ ΠΏΠΎΡΡΡΠΎΠΈΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π·Π°ΠΌΠΊΠΈ ΠΊ Π΄Π²ΡΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ ΡΡΠ°Π·Ρ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΎΡΡΠ°Π²Π½ΠΎΠΉ ΡΠ΅ΡΡΡΡ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π·Π°ΠΌΠΎΠΊ Β«ABΒ» Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ΅ΡΡΡΡΠ°ΠΌ A ΠΈ B.
β’ ΡΡΡΠΎΠ³ΠΎ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΡΡ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎ ΡΠ΅Π½Π΅) ΠΈ Π²ΡΠ΅Π³Π΄Π° Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΈΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ (ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π±ΠΎΠ»Π΅Π΅ Π΄ΠΎΡΠΎΠ³ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ²). ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΊΠ°Π·ΠΎΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ° ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠΌ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ΅Π²ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ².
Π‘Π΅ΠΌΠ°ΡΠΎΡΡ
Π‘Π΅ΠΌΠ°ΡΠΎΡΡ (ΠΈΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·ΡΠ²Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°ΠΌΠΈ ΠΠΈΠΉΠΊΡΡΡΡ (Dijkstra) ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΡΠ΅Π»Ρ) ΡΠ²Π»ΡΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠΈΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π½Π΅ΠΆΠ΅Π»ΠΈ Π·Π°ΠΌΠΊΠΈ. Π‘Π΅ΠΌΠ°ΡΠΎΡΡ ΠΌΠΎΠ³ΡΡ Π΄ΠΎΠΏΡΡΡΠΈΡΡ Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π‘Π΅ΠΌΠ°ΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΡΠΌΠ΅Π½ΡΡΠ°ΡΡΠΈΠΉΡΡ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° acquire() ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΠΈΠΉΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ release(). Π‘ΡΠ΅ΡΡΠΈΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ Π½ΡΠ»Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΆΠ΄Π°ΡΡ, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ Π·Π°ΠΌΠΊΠ°ΠΌΠΈ, ΠΏΠΎΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π½Π΅ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡΡ.
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠ»Π°ΡΡΠ° threading.Semaphore ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ) Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ½ΠΎ ΡΠ°Π²Π½ΠΎ 1, ΡΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π·Π°ΠΌΠΊΡ ΠΊΠ»Π°ΡΡΠ° Lock). ΠΠ΅ΡΠΎΠ΄Ρ acquire() ΠΈ release() Π΄Π΅ΠΉΡΡΠ²ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π²ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ Ρ Π·Π°ΠΌΠΊΠΎΠ².
Π‘Π΅ΠΌΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ ΠΎΡ ΡΠ°Π½Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅ΡΡΠΈ ΠΏΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ . ΠΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° (Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ Python) Π΄Π°Π½ Π½ΠΈΠΆΠ΅:
from threading import BoundedSemaphore
maxconnections = 5
# ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°
pool_sema = BoundedSemaphore(value=maxconnections)
# ΠΠ½ΡΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠ°:
pool_sema.acquire()
conn = connectdb()
# ... ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ...
conn.close()
pool_sema.release()
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΡΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ . Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΊΠ»Π°ΡΡ threading.BoundedSemaphore. ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° threading.Semaphore ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π΅ Π΄Π°ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ release() Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Π½ acquire().
Π‘ΠΎΠ±ΡΡΠΈΡ
ΠΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠ° threading.Event ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ. ΠΠ±ΡΠ΅ΠΊΡΡβΡΠΎΠ±ΡΡΠΈΡ ΠΈΠΌΠ΅ΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠ»Π°Π³, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ ΠΈΠ»ΠΈ ΡΠ±ΡΠΎΡΠ΅Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. ΠΡΠΈ ΡΠ²ΠΎΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ»Π°Π³ ΡΠΎΠ±ΡΡΠΈΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ±ΡΠΎΡΠ΅Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. ΠΡΠ»ΠΈ ΡΠ»Π°Π³ Π² ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ: ΠΏΠΎΡΠΎΠΊ, Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ wait() Π΄Π»Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΡ, ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° threading.Event:
β’ set() Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠ»Π°Π³, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡΠΈΠΉ ΠΎ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ. ΠΡΠ΅ ΠΆΠ΄ΡΡΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΡ ΠΎΠ΄ΡΡ ΠΈΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
β’ clear() Π‘Π±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΡΠ»Π°Π³. ΠΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ wait() ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°βΡΠΎΠ±ΡΡΠΈΡ, Π±ΡΠ΄ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠ»Π°Π³ ΡΠ±ΡΠΎΡΠ΅Π½, ΠΈΠ»ΠΈ ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠΌΠ°ΡΡΠ°.
β’ isSet() ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ»Π°Π³Π°.
β’ wait([timeout]) ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠΎΠΊ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΡΠ»Π°Π³ ΡΠ±ΡΠΎΡΠ΅Π½, ΠΈ ΡΡΠ°Π·Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΡΠ»Π°Π³ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½. ΠΡΠ³ΡΠΌΠ΅Π½Ρ timeout Π·Π°Π΄Π°Π΅Ρ ΡΠ°ΠΉΠΌΠ°ΡΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ , ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅ΡΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠΎΠ±ΡΡΠΈΠ΅ Π½Π΅ Π½Π°ΡΡΡΠΏΠΈΠ»ΠΎ.
Π‘ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ.
Π£ΡΠ»ΠΎΠ²ΠΈΡ
ΠΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠΉ. Π£ΡΠ»ΠΎΠ²ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° threading.Condition ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΌ ΡΠΎΠ±ΡΡΠΈΡΠΌ, ΠΎΠΏΠΎΠ²Π΅ΡΠ°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠ»Π°ΡΡΠ° threading.Condition ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, Π·Π°Π΄Π°ΡΡΠΈΠΉ Π·Π°ΠΌΠΎΠΊ ΠΊΠ»Π°ΡΡΠ° threading.Lock ΠΈΠ»ΠΈ threading.RLock. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π·Π°ΠΌΠΊΠ° ΠΊΠ»Π°ΡΡΠ° threading.RLock. ΠΠ΅ΡΠΎΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°βΡΡΠ»ΠΎΠ²ΠΈΡ ΠΎΠΏΠΈΡΠ°Π½Ρ Π½ΠΈΠΆΠ΅:
β’ acquire(...) ΠΠ°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π·Π°ΠΌΠΎΠΊ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡβΡΡΠ»ΠΎΠ²ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°βΠ·Π°ΠΌΠΊΠ°.