Pythonのマルチプロセスロックの仕組み

マルチプロセスでのリソースの共有においては、排他制御がないとデータ競合や不整合が生じる可能性があるため、PythonではOSが提供する低レベルの原子操作を使ってマルチプロセスロックを実現している。

Python における multiprocessing モジュールでは、マルチプロセスロックを実現するために Lock クラスを提供しています。この Lock クラスは、OS が提供する排他制御のための仕組み(セマフォ、ミューテックスなど)を利用してロックの機能を実現しています。

ロックの仕組みは、一度に 1 つプロセスだけがロックを獲得でき、他のプロセスは待機する必要があることです。プロセスがロックを獲得すると、クリティカルセクションのコードを実行し、実行が完了するとロックを解放します。その後、他のプロセスが何らかのスケジューリングポリシー(公平性、優先度など)に従ってロックの獲得を競合します。

具体的には、Lockクラスでは、OSが提供するCompare-and-Swapなどのアトミックオペレーションを使用して、ロックの取得と解放を行っています。あるプロセスがロックを取得しようとした際は、アトミック操作によってロックの状態を調べ、他のプロセスがロックを取得していたら、待機キューに入れられます。ロックが解放されたら、OSによって待機キューから1つのプロセスが選ばれてウェイクアップされ、ロックを取得できるようになります。

Python のマルチプロセスロックは、同じコンピュータ上のマルチプロセスでの同期にのみ使用でき、異なるコンピュータ上のプロセス間の通信には使用できないことに注意してください。異なるコンピュータ上のプロセス間で通信および同期を行う必要がある場合は、分散ロックまたは他の分散協調ツールを使用することを検討してください。

bannerAds