锁 —— multiprocessing.Lock  

       通过刚刚的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序(或者说由操作系统调度决定他们的顺序),一旦开启也不受我们控制。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题。

  当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。

  加锁的形式确保了程序的顺序执行,但是执行又变成了串行,降低了效率,但是不得不说,它确保了数据的安全性。

 

  l = Lock()

  一把钥匙配一把锁

  拿钥匙,锁门   l.acquire ( acquire: 获取 )

  还钥匙,开门   l.release (release: 释放)

from multiprocessing import Lock

l = Lock()

l.acquire()# 拿走钥匙,锁门,不让其他人进屋

l.release()# 释放锁。  还钥匙,开门,允许其他人进屋
# -*- coding:utf-8 -*-
# Author : Niuli
# Data : 2018/8/21 下午3:59
from multiprocessing import Process, Lock, Value
import time


def get_money(num, l):
    l.acquire()  # 拿走钥匙,锁门
    for i in range(100):  # 100块,每次取1块
        num.value -= 1
        print('取:', num.value)
        time.sleep(0.01)
    l.release()  # 还钥匙,开门,下一位可以进入


def put_money(num, l):
    l.acquire()  # 拿走钥匙,关上门
    for i in range(101):  # 100块,每次存1块
        num.value += 1
        print('存:', num.value)
        time.sleep(0.01)
    l.release()  # 还钥匙.开门,下一位可以进入


if __name__ == '__main__':
    num = Value('i', 100)  # 类似 struck 需要一个类型,一个数据
    l = Lock()  # 实例化Lock的对象l (需要先制造一把锁)
    p_get = Process(target=get_money, args=(num, l))  # 创建取钱的进程,传两个参数:钱数,锁
    p_put = Process(target=put_money, args=(num, l))  # 创建存钱的进程,传两个参数:钱数,锁
    p_get.start()  # 开启取钱的进程
    p_put.start()  # 开启存钱的进程
    # 没有join 会异步执行,主程序会先执行完,打印最终的钱数 会是最开始的钱数
    # 没有join会先执行完主程序
    # 有join,主程序会等着子程序执行完后再接着执行
    p_get.join()  # 异步转同步,让子进程先执行,主程序等着  
    p_put.join()  # 异步转同步,让子进程先执行,主程序等着
    print('这里是最终的钱数:', num.value)
银行存取钱问题

相关文章: