通訳者が 1 人しかいないシステムがあります。多くのユーザー スクリプトは、このインタープリターを経由します。各スクリプトのメモリ使用量に上限を設けたいと考えています。プロセスのみがあり、そのプロセスは各スクリプトのタスクレットを呼び出します。したがって、インタープリターとプロセスが 1 つしかないため、各スクリプトのメモリ使用量に上限を設ける方法がわかりません。これを行う最善の方法は何ですか
2 に答える
それはまったく不可能だと思います。あなたの質問は、タスクレットによって使用されるメモリが完全に分離されていることを意味しますが、おそらくそうではありません。Pythonは整数のような小さなオブジェクトを最適化しています。私の知る限り、たとえば3
、コード内のそれぞれが同じオブジェクトを使用していますが、これは不変であるため問題ありません。したがって、2つのタスクレットが同じ(小さい?)整数を使用している場合、それらはすでにメモリを共有しています。;-)
メモリは OS プロセス レベルで分離されます。特定のオブジェクトがどのタスクレットに属しているか、さらにはどのスレッドに属しているかを簡単に判断する方法はありません。
また、どのタスクレットまたはスレッドがメモリの一部を割り当てているかを分析し、割り当てすぎないようにするカスタム ブックキーピング アロケータを追加する簡単な方法はありません。また、ガベージ コレクション コードにプラグインして、解放されたオブジェクトをディスカウントする必要があります。
カスタム Python インタープリターを作成することに熱心でない限り、タスクごとにプロセスを使用するのが最善の策です。
別のスクリプトを実行する必要があるたびに、インタープリターを強制終了して再生成する必要さえありません。複数のインタープリターをプールし、スクリプトの実行後に特定のメモリしきい値を超えたインタープリターのみを強制終了します。必要に応じて、OS が提供する手段でインタープリターのメモリ消費を制限します。
タスク間で大量の共通データを共有する必要がある場合は、共有メモリを使用してください。小規模なやり取りには、ソケットを使用します (必要に応じて、ソケットより上のメッセージング レベルを使用します)。
はい、これは現在の設定よりも遅くなる可能性があります。しかし、あなたが Python を使用していることから、これらのスクリプトではタイム クリティカルなコンピューティングを実行していないと思います。