Python ใฎ threading.Lock ใ่ฉฆใใฆใฟใ
่คๆฐใฎในใฌใใใใๅๆใซๅฎ่กใใใใจๅฐใใใผใ (ใฏใชใใฃใซใซใปใฏใทใงใณ) ใไฟ่ญทใใใฎใซ Lock ใ่ฉฆใใฆใฟใใ ใตใณใใซใฏ่คๆฐใฎในใฌใใใใๅ
ฑๆใใใใชใใธใงใฏใใงใใญใใฏใใใปใชใใงๆๅใฎ้ใใ็ขบ่ชใใใ
#!/usr/bin/env python # -*- coding: utf-8 -*- from threading import Thread, Lock import time # ในใฌใใใปใผใใงใชใใชใใธใงใฏใ class NoLockedSharedObject(object): # ่คๆฐใฎในใฌใใใใไธฆๅใซๅฎ่กใใใใใกใฝใใ def count(self): # ไปฅไธใใฏใชใใฃใซใซใปใฏใทใงใณใซ่ฆ็ซใฆใ for i in range(10): print i, time.sleep(0.1) print # ในใฌใใใปใผใใชใชใใธใงใฏใ class LockedSharedObject(NoLockedSharedObject): def __init__(self): super(LockedSharedObject, self).__init__() # ใญใใฏใชใใธใงใฏใใไฝใฃใฆใใ self.lock = Lock() # ใญใใฏใซใใฃใฆๅๆใซไธใคใฎในใฌใใใใใใๅฎ่กใใใชใใกใฝใใ def count(self): # ๅฅใฎในใฌใใใใกใฝใใใๅฎ่กไธญใซในใฌใใใในใใผใใกใณใใซ็ชๅ
ฅใใใจใใญใใฏใใ with self.lock: # ใฏใชใใฃใซใซใปใฏใทใงใณใๅฎ่กใใ super(LockedSharedObject, self).count() # ๅ
ฑๆใชใใธใงใฏใใไฝฟใในใฌใใใฏใฉใน class CountThread(Thread): def __init__(self, shared_object): super(CountThread, self).__init__() # ่คๆฐใฎในใฌใใใงๅ
ฑๆใใใใชใใธใงใฏใใๅใๅใ self.shared_object = shared_object self.daemon = True def run(self): self.shared_object.count() if __name__ == '__main__': print 'nolock' # ใญใใฏใชใใฎๅ
ฑๆใชใใธใงใฏใใไฝฟใๅ ดๅ nolocked = NoLockedSharedObject() t1 = CountThread(nolocked) t2 = CountThread(nolocked) t1.start() t2.start() t1.join() t2.join() print 'lock' # ใญใใฏใใใฎๅ
ฑๆใชใใธใงใฏใใไฝฟใๅ ดๅ locked = LockedSharedObject() t3 = CountThread(locked) t4 = CountThread(locked) t3.start() t4.start() t3.join() t4.join()
ๅฎ่ก็ตๆ (ใฎไพ) ใฏไปฅไธใ
nolock 0 0 1 1 22 33 44 55 66 77 8 8 9 9 lock 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
ใญใใฏใชใใฎๆนใฏไบใคใฎในใฌใใใใไธฆๅใซๅฎ่กใใใฆใใใฎใซๆฏในใฆใใญใใฏใใใฎๆนใฏไธใคใฎในใฌใใใใใใๅฎ่กใใใฆใใชใใ
ไปๅไฝฟใฃใใฎใฏใใ ใฎ Lock ใ ใใฉใๅใในใฌใใใใใงใใใฐไฝๅบฆใญใใฏใๅๅพใใฆใใใญใใฏใใชใ RLock ใจใใใญใใฏใๅใใใใฑใผใธใซใใใ
$ python ...(็็ฅ)... >>> import threading >>> rlock = threading.RLock() >>> rlock.acquire() True >>> rlock.acquire() 1 >>> rlock.acquire() 1 >>> lock = threading.Lock() >>> lock.acquire() True >>> lock.acquire() ...(ใใญใใฏใใฆๆปใฃใฆใใชใ)...
ไบๅ็ฎใใ RLock ใฎ่ฟใๅคใๅคใใฃใฆใใฎใฏใๆขใซใญใใฏใๅๅพๆธใฟใๅฆใใๅคๅฅใงใใใใใซใใใใโฆ?