进程互斥锁

进程互斥锁

进程同步(multiprocess.Lock) 锁——multiprocess.Lock
	进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的。
	而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理。
# 多进程模拟抢票实例
# 文件db内容为: {"count":1}
# 注意一定要用双引号,不然json无法识别
from multiprocessing import Process,Lock
import time,json,random

def search():
    dic = json.load(open('db'))
    print('剩余票数: %s'%dic['count'])

def get():
    dic = json.load(open('db'))
    time.sleep(1)
    if dic['count'] > 0:
        dic['count'] -= 1
        time.sleep(2)
        json.dump(dic, open('db', 'w'))
        print('购票成功')

def task():
    search()
    get()

if __name__ == '__main__':
    for i in range(10):  # 模拟10个客户端抢票
        p = Process(target=task)
        p.start()
# 引发问题:数据写入错乱。
# 互斥锁保证数据安全
from multiprocessing import Process,Lock
import time,json,random,time

def search():
    dic = json.load(open('db'))
    print('剩余票数:%s'%dic['count'])

def get():
    dic = json.load(open('db'))
    # 模拟读数据的网络延迟
    time.sleep(random.random())
    if dic['count'] > 0:
        dic['count'] -= 1
        # 模拟写数据的网络延迟
        time.sleep(random.random())
        json.dump(dic, open('db', 'w'))
        print('购票成功')
    else:
        print('购票失败')

def task(lock):
    search()
    lock.acquire()
    get()
    lock.release()

if __name__ == '__main__':
    lock = Lock()
    for i in range(10):
        p = Process(target=task, args=(lock,))
        p.start()

总结:

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

posted @ 2020-05-22 11:01  光吃葡萄皮  阅读(209)  评论(0编辑  收藏  举报
回顶部