图零科技吧 关注:71贴子:1,771
  • 0回复贴,共1

Python线程锁(转载)

只看楼主收藏回复

由于线程之间是随机调度,并且每个线程执行指定字节或者时间,之后其它线程修改同一条数据时可能出现脏数据,所以出现了线程锁。
同步锁:
import threading
import time
n=0
lock=threading.Lock()
def task():
global n
lock.acquire()
n += 1
time.sleep(1)
print(n)
lock.release()
for i in range(10):
t=threading.Thread(target=task)
t.start()
输出结果:1-10
如果不加锁,当程序停1秒的时候,n+1已经运行了十遍,即n=10.
VLock
递归锁:
import threading
import time
n=0
lock=threading.RLock()
def task():
global n
lock.acquire()
n += 1
lock.acquire()
n+=1
time.sleep(1)
print(n)
lock.release()
lock.release()
for i in range(10):
t=threading.Thread(target=task)
t.start()
输出结果:2,4,6,8,10,12,14,16,18,20
Rlock
python中为了支持同一线程中多次请求同一资源,提供了递归锁Rlock,Rlock内部维护着一个Lock和一个Counter变量,counter记录了acquire的次数,从而使得资源可以多次被require。直到一个线程的acquire都被release,其它线程才能获得资源。如果同步锁采用多次require,就会产生死锁。


1楼2018-09-17 15:57回复