Pythonマルチプロセスのミューテックスロック

Pythonマルチプロセスのミューテックスロック

現在、3人が1台のプリンターを使用してコンテンツ
を同時に印刷しています。3つのプロセスがこれら3人を同時にシミュレートし、出力プラットフォームがプリンターをシミュレートします。

まず、通常のマルチプロセスを作成して見てみましょう。

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打印结束了

問題はないようですが、実際には、プリンタは通常、一度に1つのドキュメントしか印刷できず、3つのコピーを一緒に印刷することはできません(その後、3つのコピーの1つをランダムに印刷します)

結合を使用してp1、p2、およびp3を制限できると言う人もいます。それは確かに可能ですが、先着順の原則に従う必要がありますか?最初に印刷するのがp1なのかp2なのかp3なのかわからないので、p1を結合させた場合、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打印结束了

先着順の3つのタスクが同時にロックを取得します。たとえば、task2は最初にロックを取得し、次に次のプログラムを実行します。このとき、task1とtask3もロックを取得します。しかし、それをつかんだ後、それはロックされていたことがわかり、それはブロックされて待つことしかできませんでした。

注:task2では、time.sleep()がブロックされると、オペレーティングシステムはCPUに他のタスクへの切り替えを強制します。他のタスクはロックが開かれていないことを検出し、task2がロックを解放するまでブロックを続けます。戦い続けます。このロックのために。

この記事がお役に立てば幸いです。あなたのサポートは、継続的な進歩のための私の原動力です!

おすすめ

転載: blog.csdn.net/m0_50481455/article/details/113844197