ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

进程同步锁

2022-05-03 23:32:38  阅读:167  来源: 互联网

标签:__ 加锁 进程同步 数为 db dic json


  • 我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,但是它们之间的运行没有顺序,一旦开启也不受我们控制。
  • 尽管并发编程让我们能更加充分的利用计算机的资源,但是也给我们带来了新的问题:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件是没有问题的,要是对同一文件进行读写操作呢?要知道共享带来的是竞争,竞争带来的结果就是错乱。
from multiprocessing import Process
import json,time
#在当前目录下创建一个文件(db)
#文件db的内容:{"count":1}表示的是余票数量

def search():   #查询余票
    fp = open('db','r')
    dic = json.load(fp)   #反序列化,将文件中的json数据转换成python字典
    print('剩余车票数为:{}'.format(dic['count']))

def get():    #抢票,每次只能购买一张
    fp = open('db', 'r')
    dic = json.load(fp)
    time.sleep(0.1)
    if dic['count'] > 0:
        time.sleep(0.2)
        dic['count'] -= 1
        time.sleep(0.1)
        json.dump(dic, open('db', 'w'))    #购票后,回写到文件中
        print('购票成功')

def task():
    search()  #先查询
    get()    #后购买

if __name__ == "__main__":
    for i in range(3):
        p = Process(target=task)
        p.start()

#运行结果
#剩余车票数为:1
#剩余车票数为:1
#剩余车票数为:1
#购票成功
#购票成功
#购票成功
  • 上述案例中,总的票数只有1张,我们确成功购票三次。很明显存在问题。
  • 如何控制,就是加锁处理
    • 加锁流程
      • 1.导包:from multiprocessing import Lock
      • 2.加锁:lock.acquire()
      • 3.解锁:lock.release()
  • 下面我们还是以抢票为例,看看加锁后数据是否还会存在问题;
  • 加锁后
from multiprocessing import Process
import json,time
from multiprocessing import Lock
#在当前目录下创建一个文件(db)
#文件db的内容:{"count":1}表示的是余票数量

def search():   #查询余票
    fp = open('db','r')
    dic = json.load(fp)   #反序列化,将文件中的json数据转换成python字典
    print('剩余车票数为:{}'.format(dic['count']))

def get():    #抢票,每次只能购买一张
    fp = open('db', 'r')
    dic = json.load(fp)
    time.sleep(0.1)
    if dic['count'] > 0:
        time.sleep(0.2)
        dic['count'] -= 1
        time.sleep(0.1)
        json.dump(dic, open('db', 'w'))    #购票后,回写到文件中
        print('购票成功')

def task(lock):
    lock.acquire()   #加锁
    search()  #先查询
    get()    #后购买
    lock.release()    #解锁

if __name__ == "__main__":
    lock = Lock()   #创建一把进程锁
    for i in range(3):
        p = Process(target=task,args=(lock,))
        p.start()

#运行结果
#剩余车票数为:1
#购票成功
#剩余车票数为:0
#剩余车票数为:0

注意点:加锁会失去异步效果

标签:__,加锁,进程同步,数为,db,dic,json
来源: https://www.cnblogs.com/xwltest/p/16219917.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有