マルチプロセス操作 - ロックmultiprocess.Lockのプロセスを使用して
前処理モジュールを学習することによって、我々は、IOリソースをより完全な使用が、並行プログラミングを達成したが、欠点があります:複数のプロセスがデータリソースを共有し、彼らは混沌のデータセキュリティや順序につながるとき問題。
問題として、我々は実行の順序を維持するためのプロセスのロックを導入しています
ラッシュチケットをシミュレートするために、例えば、データセキュリティの重要性を見てみましょう。
from multiprocessing import Process,Lock
import json,time,os
# 获取剩余票数
def search():
time.sleep(1) # 模拟网络io(网络延迟)
with open('db.txt','rt',encoding='utf-8') as fr:
res = json.load(fr)
# print(res)
print(f"还剩{res['count']}")
def get():
with open('db.txt','rt',encoding='utf-8') as fr:
res = json.load(fr)
time.sleep(1) # 模拟网络io(网络延迟)
if res['count'] > 0 :
res['count'] -= 1
with open('db.txt','wt',encoding='utf-8') as fw:
json.dump(res,fw)
print(f'进程{os.getpid()} 抢票成功')
time.sleep(1) # 模拟网络io(网络延迟)
else:
print('票已经售空了!!!')
def func(lock):
search()
# 锁住
lock.acquire()
get()
lock.release()
if __name__ == '__main__':
lock = Lock() # 写在主进程是为了让子进程拿到一把锁
for i in range(10):
p = Process(target=func,args=(lock,))
p.start()
# p.join()
# 进程锁 是把锁住的代码变成了串行
# join 是把所有非子进程变成了串行
# 为了保证数据的安全,串行牺牲掉了效率
ロックはデータの同じ部分を確保するために複数のプロセスを変更することができた場合、1つのタスクのみを修正することができ、同時に、つまり、シリアルの変更は、はい、スピードは遅いですが、速度は、データのセキュリティを確保するために犠牲にされます。
それは、プロセス間通信を実現するために、データファイルを共有することができますが、質問ですが:
- 低効率(共有データファイルに基づいて、およびデータファイルがハードディスク上にあります)
- これは、独自のロックハンドルを必要とします
だから我々は考慮に入れることができます解決のためのより良い外観をしたいです:
- 高効率(メモリ内のデータを共有する複数のプロセス)
- 私たちはロックの問題を処理するのに役立ちます。キューとのパイプ:これは、メッセージベースIPC通信機構mutiprocessingモジュールは、私たちを提供しています。
キューおよびパイプがメモリに保存されたデータであり、キューが(パイプライン+ロック)ロックの複雑な問題から、私たちは自由にさせ、達成するために基づいており、我々はできるだけ多くのメッセージングを使用して、共有データを使用して回避しようとすべきですキューは、複雑な同期とロックの問題を扱う避けるため、だけでなく、プロセスの数が増加し、多くの場合、展性の優れた可用性を得ることができます。