文山羊 2020-03-28
锁:可以保证线程同步和线程安全
1)Lock锁
方式1:Lock
from threading import Thread, Lock
import threading
def run(lock, num):
lock.acquire() # 获得锁
threadName = threading.current_thread().getName() # 取得当前线程的线程名
print("%s, Hello Num: %s" %(threadName, num))
lock.release() # 释放锁
if __name__ == ‘__main__‘:
lock = Lock() # 创建一个共享锁实例
for num in range(20):
Thread(name=‘Thread-%s‘ % str(num), target=run, args=(lock, num)).start()
# 方式2
import threading
import time
data = 0
lock = threading.Lock() # 创建一个锁对象
def func():
global data
print("%s acquire lock...\n" % threading.currentThread().getName())
if lock.acquire():
print("%s get lock...\n" % threading.currentThread().getName())
data += 1 # must lock
time.sleep(2) # 其它操作
print("%s release lock...\n" % threading.currentThread().getName()) # 调用release()将释放锁
lock.release()
startTime = time.time()
t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t3 = threading.Thread(target=func)
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
endTime = time.time()
print("used time is", endTime - startTime)2)Semaphore锁
from threading import Thread, Lock
import threading
import time
def worker(s, i):
s.acquire()
print(threading.current_thread().name + " acquire")
time.sleep(i)
print(threading.current_thread().name + " release")
s.release()
if __name__ == "__main__":
# 设置限制最多3个线程同时访问共享资源
s = threading.Semaphore(3)
for i in range(5):
t = Thread(target=worker, args=(s, i * 2))
t.start()
死锁
import threading
import time
lock1 = threading.Lock()
lock2 = threading.Lock()
print(lock1, lock2)
class T1(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.t_name = name
def run(self):
lock1.acquire()
time.sleep(1) # 睡眠的目的是让线程2获得调度,得到第二把锁
print(‘in thread T1‘,self.t_name)
time.sleep(2)
lock2.acquire() # 线程1请求第二把锁
print(‘in lock l2 of T1‘)
lock2.release()
lock1.release()
class T2(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.t_name = name
def run(self):
lock2.acquire()
time.sleep(2) # 睡眠的目的是让线程1获得调度,得到第一把锁
print(‘in thread T2‘,self.t_name)
lock1.acquire() # 线程2请求第一把锁
print(‘in lock l1 of T2‘)
lock1.release()
lock2.release()
def test():
thread1 = T1(‘A‘)
thread2 = T2(‘B‘)
thread1.start()
thread2.start()
if __name__== ‘__main__‘:
test()# 伪代码:死锁:
锁1
锁2
线程1:
锁1.acquire() # 获得锁1
sleep(2)
锁2.acquire() # 获取锁2 的时候要等线程2释放了才可以获取
锁1.release() # 要等上一步执行了才可以释放锁1
线程2:
锁2.acquire() # 获得锁2
sleep(2)
锁1.acquire() # 获取锁1 的时候要等线程1释放了才可以获取
锁2.release() 要等上一步执行了才可以释放锁2