沐风2021-进程安全

[复制链接]
作者: ecithy | 时间: 2021-5-30 22:56:58 | python基础|
0 48
发表于 2021-5-30 22:56:58| 显示全部楼层 |阅读模式

和多线程一样,如果多个进程竞争相同资源,为了防止操作出问题,可以通过锁来避免。

import time
import multiprocessing


def task():
    # 假设文件中保存的内容就是一个值:10
    with open('1.txt', mode='r', encoding='utf-8') as f:
        current_num = int(f.read())

    print("排队抢票了")
    time.sleep(1)

    current_num -= 1
    with open('1.txt', mode='w', encoding='utf-8') as f:
        f.write(str(current_num))


if __name__ == '__main__':
    for i in range(20):
        p = multiprocessing.Process(target=task)
        p.start()

最后发现,文件1.txt的值不是0而是9。 和之前的多线竞争变量一样,同一时间,所有的进程获取的文件1.txt的值是10

进程锁

# 语法一
import time
import multiprocessing


def task(lock):
    print("开始")
    lock.acquire()
    # 假设文件中保存的内容就是一个值:10
    with open('1.txt', mode='r', encoding='utf-8') as f:
        current_num = int(f.read())

    print("排队抢票了")
    time.sleep(0.5)
    current_num -= 1

    with open('1.txt', mode='w', encoding='utf-8') as f:
        f.write(str(current_num))
    lock.release()


if __name__ == '__main__':
    lock = multiprocessing.RLock()  # 进程锁

    for i in range(10):
        p = multiprocessing.Process(target=task, args=(lock, ))
        p.start()

    # spawn模式,需要特殊处理。
    time.sleep(7)
# 语法二
import time
import multiprocessing


def task(lock):
    print("开始")
    with lock:
        # 假设文件中保存的内容就是一个值:10
        with open('1.txt', mode='r', encoding='utf-8') as f:
            current_num = int(f.read())

        print("排队抢票了")
        time.sleep(0.5)
        current_num -= 1

        with open('1.txt', mode='w', encoding='utf-8') as f:
            f.write(str(current_num))


if __name__ == '__main__':
    lock = multiprocessing.RLock()  # 进程锁

    for i in range(10):
        p = multiprocessing.Process(target=task, args=(lock,))
        p.start()

    # spawn模式,需要特殊处理。
    time.sleep(7)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

!jz_fbzt! 快速回复 !jz_sctz! !jz_fhlb! 按钮
快速回复 返回列表 返回顶部