互斥锁 Lock

进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理

1.锁将并发变成了串行,牺牲了运行效率,但避免了竞争
2.锁在主进程中实例化产生,在子进程中使用
3.在修改数据处加锁,修改不同的数据用不同的锁
from multiprocessing import Process, Lock
import json
import time
​
# 查票
def search(name):
    with open('data', 'r', encoding='utf-8') as f:
        data = f.read()  # 读出的是json模式的数据
        t = json.loads(data).get('ticket')
        print('用户%s查询余票为:%s'%(name, t))
# search('waller')
​
# 买票
def buy(name):
    with open('data', 'r', encoding='utf-8') as f:
        data_json = f.read()  # 读出的是json模式的数据
        data = json.loads(data_json)
        t = data.get('ticket')
        # 模拟抢票时间
        time.sleep(2)
        if not t > 0 :
            print('已无票')
            return
        t -= 1
        data['ticket'] = t
        # 跟新数据
        with open('data', 'w', encoding='utf-8') as f:
            json.dump(data, f)  # 将更新后的数据序列化到数据库中
        print('用户%s,购票成功'%name)
​
# 在进程中调用 search 与 buy 函数
def run(name, mutex):
    search(name)
    mutex.acquire()  # 抢锁 加锁,保证每次只有一个进程在执行锁里面的程序,这一段程序对于所有写上这个锁的进程,大家都变成了串行
    buy(name)  # 被锁的函数
    mutex.release()  # 释放锁
​
​
if __name__ == '__main__':
    # 生成一把锁
    mutex = Lock()
    # 创建5个进程
    for i in range(5):
        p = Process(target=run, args=('waller',mutex))
        p.start()

总结:加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。

问题:虽然可以用文件共享数据显示进程间数据通信但问题是

  • 效率低(共享数据基于文件,而文件是硬盘上的数据)
  • 需要自己加锁处理
发布了163 篇原创文章 · 获赞 4 · 访问量 1798

猜你喜欢

转载自blog.csdn.net/Waller_/article/details/104087216
今日推荐