3

Python でいくつかの並列計算を実行する必要があります。私が考えることができる唯一の互換性のあるアプローチは、マルチプロセス/フォーク モデルですが、これはいくつかの理由で理想的とは言えません。

  • 私が理解していることから、Windowsのフォークは高価です
  • きめ細かなプロセス管理 (シグナル、つまり SIGSTOP/SIGCONT) は扱いにくい (つまり、言語の外部)

タスクの要件は次のとおりです。

  • タスクは新しいタスクを生成する可能性があります
  • タスクはタスクマネージャーに登録する必要があります
  • タスクは共有状態を必要としません
  • タスクは値を返す必要があります (python オブジェクト)

タスク マネージャーは、同時実行タスクの数をスケジュールおよび制限する役割を果たします。タスク マネージャーの要件は次のとおりです。

  • 新しいタスクが開始されると、タスク マネージャーは、所定の制限に基づいて他のタスクを一時停止する場合があります。
  • タスクが戻ると、タスク マネージャーは中断された他のタスクを続行できます。
  • タスクの戻り値が要求されると、タスク マネージャーはタスクの優先度を再編成することがあります (デッドロックを防ぎます)。

ご覧のとおり、タスク マネージャーは並列/並行プロセスである必要はありません。各タスクは、開始または停止時にタスク マネージャーへの同期呼び出しを行う場合があります。他のタスクを待機しているタスクも、同期呼び出しを行う場合があります。

私は他のアプローチを考えることができないようです:

  • asyncio は限られたプール内で並列プロセスを開始できますが、そのアプローチはタスクのプリエンプションよりもデータの並列処理に適しています。外部からのタスクの横取り (中断) は、協調的にプログラムされたイベントと互換性がありません。私が間違っている場合は修正してください。ただし、asyncio を使用することはできますが、プロセスを使用する必要があり、「タスク開始/停止」イベントでシグナルを送信する必要があるため、生活が楽になることはありません (利益のない抽象化)。 ?
  • スタックレス python が適しているかもしれませんが、実際には python ではありませんか?

何か案は?

PS 私の最終目標は、(装飾された) 関数呼び出しを自動的に並列化することです。タスク マネージャは、スラッシング (フォーク爆弾) を回避するために、並行して実行されるタスク (つまり、再帰関数) の数を制限します。レイジー(タスク待機)、純粋(共有状態なし)、スタックレス(軽量スレッド)言語の方が適しているかもしれませんが、Pythonを使用する必要があります...

4

1 に答える 1