Python でいくつかの並列計算を実行する必要があります。私が考えることができる唯一の互換性のあるアプローチは、マルチプロセス/フォーク モデルですが、これはいくつかの理由で理想的とは言えません。
- 私が理解していることから、Windowsのフォークは高価です
- きめ細かなプロセス管理 (シグナル、つまり SIGSTOP/SIGCONT) は扱いにくい (つまり、言語の外部)
タスクの要件は次のとおりです。
- タスクは新しいタスクを生成する可能性があります
- タスクはタスクマネージャーに登録する必要があります
- タスクは共有状態を必要としません
- タスクは値を返す必要があります (python オブジェクト)
タスク マネージャーは、同時実行タスクの数をスケジュールおよび制限する役割を果たします。タスク マネージャーの要件は次のとおりです。
- 新しいタスクが開始されると、タスク マネージャーは、所定の制限に基づいて他のタスクを一時停止する場合があります。
- タスクが戻ると、タスク マネージャーは中断された他のタスクを続行できます。
- タスクの戻り値が要求されると、タスク マネージャーはタスクの優先度を再編成することがあります (デッドロックを防ぎます)。
ご覧のとおり、タスク マネージャーは並列/並行プロセスである必要はありません。各タスクは、開始または停止時にタスク マネージャーへの同期呼び出しを行う場合があります。他のタスクを待機しているタスクも、同期呼び出しを行う場合があります。
私は他のアプローチを考えることができないようです:
- asyncio は限られたプール内で並列プロセスを開始できますが、そのアプローチはタスクのプリエンプションよりもデータの並列処理に適しています。外部からのタスクの横取り (中断) は、協調的にプログラムされたイベントと互換性がありません。私が間違っている場合は修正してください。ただし、asyncio を使用することはできますが、プロセスを使用する必要があり、「タスク開始/停止」イベントでシグナルを送信する必要があるため、生活が楽になることはありません (利益のない抽象化)。 ?
- スタックレス python が適しているかもしれませんが、実際には python ではありませんか?
何か案は?
PS 私の最終目標は、(装飾された) 関数呼び出しを自動的に並列化することです。タスク マネージャは、スラッシング (フォーク爆弾) を回避するために、並行して実行されるタスク (つまり、再帰関数) の数を制限します。レイジー(タスク待機)、純粋(共有状態なし)、スタックレス(軽量スレッド)言語の方が適しているかもしれませんが、Pythonを使用する必要があります...