线程锁+信号量--day34

"""
  ----线程锁----

什么时候用锁 当多个进程或多个线程需要同时修改同一份数据时,
可能会造成数据的错乱,所以必须得加锁
"""

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()

 

posted @ 2019-01-02 15:56  WenChen-0o0  阅读(204)  评论(0编辑  收藏  举报