並行処理アプリケーションを作成する、とは?
| 登録日 | :2025/06/07 13:38 |
|---|---|
| カテゴリ | :Python基礎 |
並行処理システムを設計するためのフレームワークをもとに考え方をまとめる
並列処理とは何か
プログラムは逐次計算のために書かれてきた。タスク(処理)を順番を開始して実行するモデルである。
並行処理プログラミングは、プログラムを複数のタスクに分割し、それらのタスクをどの順序で実行しても同じ結果になることを意味する。パフォーマンス、効率性、正確さ、ユーザビリティの最適化を目的として設計されている。(並行処理のユニットは、タスク、コルーチン、プロセス、スレッドなどがある)
並行処理で問題になることとして、共有リソースへの同時アクセス(書き込みなど)がある。
古い情報を間違った更新する可能性や、デッドロックとなってしまう可能性、別のシステムのデータが一貫した値に収束しない、などの可能性がある。
並列処理の順序は、OS依存となっている(開発者は制御できない)ため、エラーの再現性が非常に難しいケースもある。アプリケーションで適切な設計を行い、タスク間の通信を最小限に抑え、効果的な同期テクニックを導入することで、そういうエラーを回避することが必要。
タスク間の通信は、同期・非同期それぞれで行う方法がある
同期:処理が完了するため制御が戻らないため、同期ポイントが発生する
非同期・何かが起きることを要求し、その何かが起こったら通知を受け取るが、それまでの間は他の作業を行うためにリソースを解放する。
Fosterの方法論
並行処理プログラムを作成するのに役立つ方法論。1995年にIan Fosterによって一連の手順が打ち出された、Fosterno設計方法論( Foster's design methodology)がある
1 分割
処理を適切なタスクに分割すr
2 通信
分割した処理と、必要に応じて情報の共有やお互いの要件などを取得するなどの通信を行う
3 凝集化(ぎょうしゅうか)
タスクと責務を特定の問題領域に分割することで、責務の領域を確立することを表す。
分割したタスクのうち、パフォーマンス要件と実装コストを考慮してグループ化し、より大きいタスクに見直す。
4 マッピング
最後に、作成したタスク処理の割り当てを行う。(Threadの数、CPU数などのリソースなどを決める)
*設計プロセスの早すぎる段階で、具体的な並行処理のメカニズムを選択してはいけない(TheadやMultiprocess, async/awaitなど)。それぞれ長短があり、要件をしっかり明確化してから、アルゴリズムを選択する必要がある。