python多进程之互斥锁

python多进程之互斥锁

现在有三个人同时用一个打印机打印内容
三个进程同时模拟这三个人,输出平台模拟打印机

我们先写一个普通的多进程来看看

from multiprocessing import Process
import time
import os
import random

def task1():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1,3))
    print(f"{os.getpid()}打印结束了")

def task2():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1,3))
    print(f"{os.getpid()}打印结束了")

def task3():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1,3))
    print(f"{os.getpid()}打印结束了")

if __name__ == "__main__":

    p1 = Process(target=task1)
    p2 = Process(target=task2)
    p3 = Process(target=task3)

    p1.start()
    p2.start()
    p3.start()

7976开始打印了
14068开始打印了
1240开始打印了
1240打印结束了
7976打印结束了
14068打印结束了

看起来好像没什么问题的样子,然而——现实生活中,打印机一般一次只能打印一个文件,不能三份一起打(然后随机打出三份中的其中一份结果)

有人说,可以用join进行限制p1、p2、p3,确实可以,但是是不是得遵循先来后到的原则?你不知道是p1还是p2还是p3先打印,如果你让p1 join了,假如是p2先来打印又该怎么办?

所以这里,我们使用互斥锁——谁先来谁先打印:

from multiprocessing import Process
from multiprocessing import Lock
import time
import os
import random


def task1(p, lock):
    '''一把锁不能同时上两次,互斥锁只能上一次解一次'''
    lock.acquire()
    # lock.acquire()
    print(f"{p}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{p}打印结束了")
    lock.release()


def task2(p, lock):
    lock.acquire()
    print(f"{p}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{p}打印结束了")
    lock.release()


def task3(p, lock):
    lock.acquire()
    print(f"{p}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{p}打印结束了")
    lock.release()


if __name__ == "__main__":

    mutex = Lock()

    p1 = Process(target=task1, args=('p1', mutex))
    p2 = Process(target=task2, args=('p2', mutex))
    p3 = Process(target=task3, args=('p3', mutex))

    p1.start()
    p2.start()
    p3.start()


p1开始打印了
p1打印结束了
p2开始打印了
p2打印结束了
p3开始打印了
p3打印结束了

三个任务同时抢占一把锁,先到先得,例如task2先抢到这把锁,然后执行下边的程序,此时task1和task3也会抢锁。但是抢到之后,发现已经上锁了,只能阻塞等待。

注:task2中,遇到time.sleep()时阻塞,操作系统强行将CPU切换到其他任务,其他任务发现锁还没有被打开,会继续阻塞,直到task2将锁释放掉之后,task1和task3才能继续争抢这把锁。

希望本篇文章给你带来帮助,您的支持就是我不断前进的动力!

猜你喜欢

转载自blog.csdn.net/m0_50481455/article/details/113844197