"""
----线程锁----
什么时候用锁 当多个进程或多个线程需要同时修改同一份数据时,
可能会造成数据的错乱,所以必须得加锁
"""
from threading import Thread,Lock
lock =Lock()
a = 100
def task():
lock.acquire()
global a
temp = a - 1
time.sleep(0.01)
a = temp
lock.release()
ts = []
for i in range(100):
t = Thread(target=task)
t.start()
ts.append(t)
for t in ts:
t.join()
print(a)
"""
----信号量-----
其实也是一种锁,特点是可以设置一个数据可以被几个线程(进程)共享
与普通锁的区别
普通锁一旦加锁 则意味着这个数据在同一时间只能被一个线程使用
信号量 可以让这个数据在同一时间只能被多个线程使用
使用场景,可以限制一个数据被同时访问的次数,保证程序正常运行
"""
from threading import Semaphore,Thread,current_thread
import time,random
sem = Semaphore(3) # 设置可以背共享的次数
def task():
sem.acquire()
print("%s run..." % current_thread())
time.sleep(3)
sem.release()
for i in range(10):
t = Thread(target=task)
t.start()