互斥锁--day33

"""
----互斥锁----
当多个进程共享一个数据时,可能会造成数据错乱
1.使用join 来让这些进程 串行 但是这将造成 无法并发 并且 进程执行任务的顺序就固定了
2.使用锁 将需要共享的数据加锁 其他进程在访问数据时 就必须等待当前进程使用完毕

缺点:多个任务在共享一个数据时
串行效率低 但是不会出问题
并发效率高 但是数据可能错乱

----RLock----
RLock表示可重入锁 特点是 可以多次执行acquire
Rlock 在执行多次acquire时 和普通Lock没有任何区别
如果在多进程中使用Rlock 并且一个进程a 执行了多次acquire
其他进程b要想获得这个锁 需要进程a 把锁解开 并且锁了几次就要解几次
普通锁如果多次执行acquire将会锁死

锁的本质 就是一个bool类型的数据 在执行代码前 会先判断 这个值
注意 在使用锁时 必须保证锁是同一个

互斥锁
互相排斥的锁
"""

from multiprocessing import Process, Lock

import random #随机取值
import time

def task1(lock):
lock.acquire() # 上锁
lock.acquire() # 如果一个程序上了多把锁不解开锁,将无法被再次执行(是一个阻塞的函数 会等到别的进程释放锁才能继续执行)
print("1")
time.sleep(random.randint(1, 2))
print("1.1")
time.sleep(random.randint(1, 2))
lock.release() # 解锁

def task2(lock):
lock.acquire()
print("2")
time.sleep(random.randint(1, 2))
print("2.1")
time.sleep(random.randint(1, 2))
lock.release()

if __name__ == '__main__':
lock = Lock() # 创建一个锁
p1 = Process(target=task1,args=(lock,))
p1.start()

p2 = Process(target=task2,args=(lock,))
p2.start()


# ----互斥锁的使用场景-抢票----
import json,time,random
from multiprocessing import Process,Lock

def check_ticket(usr):
time.sleep(random.randint(1,3))
with open("ticket.json", "r", encoding="utf-8") as f:
dic = json.load(f)
print("%s查看 剩余票数:%s" % (usr, dic["count"]))

def buy_ticket(usr):
with open("ticket.json","r",encoding="utf-8") as f:
dic = json.load(f)
if dic["count"] > 0:
time.sleep(random.randint(1,3))
dic["count"] -= 1
with open("ticket.json","w",encoding="utf-8") as f:
json.dump(dic,f)
print("%s 购票成功" % usr)

def task(usr,lock):
check_ticket(usr)
lock.acquire()
buy_ticket(usr)
lock.release()

if __name__ == '__main__':
lock = Lock()
for i in range(10):
p = Process(target=task, args=("用户%s" % i, lock))
p.start()
posted @ 2018-12-29 16:38  WenChen-0o0  阅读(110)  评论(0编辑  收藏  举报