デーモン
子プロセスが続くメインコースの最後に限り、メインプロセスを守っ子プロセスは、以上です
from multiprocessing import Process
import time
def task(name):
print(f'{name}is running')
time.sleep(2)
print(f'{name}is gone')
if __name__ == '__main__':
p = Process(target=task,args=('小黑',))
p.daemon = True # 在进程start之前,将p子进程设置成守护进程,只要主进程结束,守护进程马上结束.
p.start()
time.sleep(1)
print('主进程')
二つのゾンビプロセスと孤立
Unixベースの環境(Linuxでは、MacOSの)
主要プロセスの終了後に子プロセスが終了するまで待機します
メインプロセスは、常に、子プロセスの後、時間の期間内に子プロセスがリサイクルされますとき、実行中の子プロセスを監視します。
なぜすぐに子プロセスの後にその回復のプロセスを習得しないのだろうか?
メインプロセスとサブプロセスが非同期関係の場合に終わり、主要プロセスはすぐに子プロセスをキャプチャすることはできません。
すぐにプロセスの終了後に子供がメモリ内のリソースを解放する場合は、メインプロセスは、子プロセスの状態を監視する方法はありません
UNIXは、上記の問題のためのメカニズムを提供します。
すべてのサブプロセスの終了後、直ちにアクションリンク、ファイルのデータ・メモリのほとんどを解放されますが、いくつかの要素を保持します:、メインプロセス監視を待って、リサイクルを、プロセスID、終了時間を実行しています。
ゾンビプロセス:すべてのサブプロセスの終了後に、主要プロセスをリサイクルされる前に、ゾンビ状態になります。
ハザード:主要なプロセスは、(/ waitpidのを待つ)ゾンビプロセスを回復しない場合、プロセスpid番号を取り上げ、メモリを取ることになる、ゾンビプロセスの多くを生成します。
ソリューション:直接、initによって再利用するためのプロセスを孤立したすべてのゾンビをメインプロセスを強制終了。
孤児プロセスは:何らかの理由でメイン処理が終了しますが、子プロセスがまだ実行されている、子プロセスが孤立した主なプロセスが終わるとなり、すべての孤児は、プロセスが回収されるinitは、initはなり。回収された主要なプロセス、。
三のミューテックス
from multiprocessing import Process
import time
import random
import os
import json
from multiprocessing import Lock
def task(lock):
lock.acquire()
print(f'{os.getpid()}开始打印')
time.sleep(random.randint(1,3))
print(f'{os.getpid()}打印结束')
lock.release()
if __name__ == '__main__':
lock = Lock()
for i in range(3):
p = Process(target=task,args=(lock,))
p.start()
多くのプロセスは、その順序(データセキュリティ)は、その後、ミューテックスロックと呼ばれているシリアルを作るためにロックを追加するためにそれを与えることを保証するために、リソースのグラブ(データ)を共有しながら。
ミューテックス:あなたは安全にデータの順序性と公平性を保証することができます。
ロックとの違いに参加
共通:それは手順に沿って行われていることを確認するために、シリアルによって複雑になることができます
異なる点:公平性を確保するためにロックスクランブル系列を聞かせて、人工的な設定手順に参加します。
4つのプロセス間の通信
1.ファイル・ベースの通信:
メモリ内のレベルのプロセスが隔離されているが、ディスク上のファイルは、あなたがそれにアクセスすることができます
from multiprocessing import Process
import time
import random
import os
import json
from multiprocessing import Lock
def search():
time.sleep(random.randint(1,3))
with open('t1.json',encoding='utf-8')as f:
dic = json.load(f)
print(f'{os.getpid()}查看了票数,还剩{dic["count"]}张票')
def buy():
with open('t1.json', encoding='utf-8')as f:
dic = json.load(f)
if dic["count"] > 0:
dic['count'] -= 1
time.sleep(random.randint(1, 3))
with open('t1.json','w',encoding='utf-8')as f1:
json.dump(dic,f1)
print(f'{os.getpid()}购票成功')
else:
print('没票了')
def task(lock):
search()
lock.acquire()
buy()
lock.release()
if __name__ == '__main__':
lock = Lock()
for i in range(6):
p = Process(target=task,args=(lock,))
p.start()
ファイルベースのプロセス間通信:低効率、独自のロックとデッドロックしがち。
2.通信キューに基づいて、
キューの特性:先入れ先出し(FIFO)で、常にこのデータを保持します。
from multiprocessing import Queue
q = Queue(3) # maxsize 最大容量
q.put(1)
q.put('asdr')
q.put([1,2,3])
q.put(666,block=False) # 不写block默认为True,超过最大容量会阻塞,block = False直接报错
q.put(666,timeout=3) # 延迟3s之后还阻塞直接报错
print(q.get())
print(q.get())
print(q.get())
print(q.get(block=False))
print(q.get(timeout=3))
ファイブ生産者 - 消費者モデル
プロデューサーの消費者モデル三つの要素:
メーカー:データを生成します
消費者:さらなる処理のために受信データ
コンテナ:キュー
キュー・コンテナの役割:生産と消費電力のバランスをとるためのクッションとして機能し、デカップリング
from multiprocessing import Process,Queue
import time,random
def producer(q,name):
for i in range(1,6):
time.sleep(random.randint(1,2))
res = f'{i}号包子'
q.put(res)
print(f'生产者{name}生产了{res}')
def consumer(q,name):
while 1:
try:
food = q.get(timeout=3)
time.sleep(random.randint(1,3))
print(f'消费者{name}吃了{food}')
except Exception:
return
if __name__ == '__main__':
q = Queue()
p1 = Process(target=producer,args=(q,'孙宇'))
p2 = Process(target=consumer,args=(q,'海狗'))
p1.start()
p2.start()