Python互斥锁
互斥锁是什么?
将并发变成串行 虽然牺牲了程序的执行效率 但是保证了数据安全
什么时候使用互斥锁呢?
多个程序同时操作一份数据的时候容易产生数据错乱
为了避免数据错乱 我们需要使用到互斥锁
如何使用?
导入模块 from multiprocessing import Process, Lock
mutex = Lock() # 变量名创建一个锁
mutex.acquire() # 抢锁
mutex.release() # 释放锁
上一锁 谁先抢到谁使用 其他人等着使用完才能使用
模拟12306 模拟抢票 查票 买票
from multiprocessing import Process
import time
import json
import random
def search(name):
with open(r'data.json', 'r', encoding='utf8') as f:
data = json.load(f)
print('%s在查票 当前余票为:%s' % (name, data.get('ticket_num')))
def buy(name):
with open(r'data.json', 'r', encoding='utf8') as f:
data = json.load(f)
time.sleep(random.randint(1, 3))
if data.get('ticket_num') > 0:
data['ticket_num'] -= 1
with open(r'data.json', 'w', encoding='utf8') as f:
json.dump(data, f)
print('%s买票成功' % name)
else:
print('%s很倒霉 没有抢到票' % name)
def run(name):
search(name)
buy(name)
if __name__ == '__main__':
for i in range(10):
p = Process(target=run, args=('用户%s'%i, ))
p.start()
'''输出结果10个人都抢到了票 所以我们需要用到互斥锁!!!'''
解决方法:
from multiprocessing import Process, Lock
import multiprocessing
import time
import json
import random
def search(name):
with open(r'data.json', 'r', encoding='utf8') as f:
data = json.load(f)
print('%s在查票 当前余票为:%s' % (name, data.get('ticket_num')))
def buy(name):
with open(r'data.json', 'r', encoding='utf8') as f:
data = json.load(f)
time.sleep(random.randint(1, 3))
if data.get('ticket_num') > 0:
data['ticket_num'] -= 1
with open(r'data.json', 'w', encoding='utf8') as f:
json.dump(data, f)
print('%s买票成功' % name)
else:
print('%s很倒霉 没有抢到票' % name)
def run(name, mutex):
search(name)
mutex.acquire()
buy(name)
mutex.release()
if __name__ == '__main__':
multiprocessing.set_start_method("fork")
mutex = Lock()
for i in range(10):
p = Process(target=run, args=('用户%s' % i, mutex))
p.start()
'''此时的结果就是只有一个人抢到了票 这就是互斥锁的作用 '''