进程同步锁

2022/5/4 7:14:10

本文主要是介绍进程同步锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  • 我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,但是它们之间的运行没有顺序,一旦开启也不受我们控制。
  • 尽管并发编程让我们能更加充分的利用计算机的资源,但是也给我们带来了新的问题:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件是没有问题的,要是对同一文件进行读写操作呢?要知道共享带来的是竞争,竞争带来的结果就是错乱。
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

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



这篇关于进程同步锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程