一つは、デーモン
1、の概念
デーモンは、Pythonでのプロセスであります
デフォルトでは、コードが終了しても、主要なプロセスは、彼らが自分の子供を終了するプロセスの終了を待つことになります
デーモンプロセスbが設けられた他の処理には、デーモンBデーモンである場合
特長は以下のとおりです。タスクBが最後に来る完了していない場合であっても、保護者の終わりである場合には
2、メタファー:
康は、デーモンプロセスが皇帝康の側室であります
コースを埋葬するためにまだ生きている場合はそれより前のタスクの側室が終了した直後にハングアップした場合康は、妾に死亡しました
3、ケース:
from multiprocessing import Process
import time
def task():
print("zi run")
time.sleep(3)
print("zi over")
if __name__ == '__main__':
p = Process(target=task)
p.daemon = True # 将这个进程设置为了守护进程 必须在开启进程前设置
p.start()
print("主over")
セキュリティ問題の第二に、プロセス
1、原因
複数の同時タスクが、同時に同じリソースを操作するときは、データの問題で混乱が発生します
図2に示すように、溶液法
コードシリアルアドレスセキュリティ問題への同時変化によって公共資源の同時動作が、犠牲効率
方法1:シリアル(参加):
直接参加機能を使用します
デメリット:すべてのコードのすべてのシリアルタスク、またはプロセスを開けないでください。この時よりも良いが、複数のプロセスの中で、元の公正な競争は、実行順序が課されている参加します
方法2:シリアル(ミューテックス)
原則は公共資源をロックコードのこの部分の実装に一つだけのプロセスを同じ時間を確保するために、コード上で動作させることです
ミューテックスは何ですか
相互排他ロック
利点:コードシリアルの一部のみ
注意:あなたはその一つだけのロックを確認する必要があります
使用します。
from multiprocessing import Process,Lock
import time,random
def task1(mutex):
# 假设这不是访问公共资源 那么还可也并发执行
for i in range(10000):
print(1)
mutex.acquire() # 这是加锁
time.sleep(random.random())
print("-------name is nick")
time.sleep(random.random())
print("-------gender is girl")
time.sleep(random.random())
print("-------age is 18")
mutex.release() # 解锁
def task2(mutex):
for i in range(10000):
print(2)
mutex.acquire()
time.sleep(random.random())
print("++++++++name is bgon")
time.sleep(random.random())
print("++++++++gender is oldman")
time.sleep(random.random())
print("++++++++age is 48")
mutex.release()
if __name__ == '__main__':
mutex = Lock() # 创建一把互斥锁
print("创建锁了!!!!")
p1 = Process(target=task1,args=(mutex,))
p2 = Process(target=task2,args=(mutex,))
p1.start()
p2.start()
効率の低下に起因するセキュリティ上の問題を解決するためのロック
ただ制限コードの実行は、本質的にTrueまたはFalseにフラグで追加するために、実際にはロック
安全性を確保し、効率を向上させるためにはどのようにすることです
锁的 粒度
粒度指的是被锁住的代码的多少
粒度越大锁住的越多 效率越低
3、ミューテックスの場合:
グラブ票
def show():
with open("db.json") as f:
data = json.load(f)
print("剩余票数",data["count"])
def buy():
with open("db.json") as f:
data = json.load(f)
if data["count"] > 0:
data["count"] -= 1
with open("db.json","wt") as f2:
json.dump(data,f2)
print("抢票成功!")
def task(mutex):
show()
mutex.acquire()
buy()
mutex.release()
if __name__ == '__main__':
mutex = Lock()
for i in range(5):
p = Process(target=task,args=(mutex,))
p.start()