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がロックを解放するまでブロックを続けます。戦い続けます。このロックのために。
この記事がお役に立てば幸いです。あなたのサポートは、継続的な進歩のための私の原動力です!