私のスクリプトは、Pythonコードの任意の長さと-content文字列を受け入れ、それらをexec()ステートメント内で実行します。任意のコードが実行される時間が所定の制限を超えた場合、exec()ステートメントを終了し、ブール値フラグを設定して、早期終了が発生したことを示す必要があります。
これはどのように達成できますか?
追加情報
これらのコードは、多数のスレッドで並行して実行されます(または、少なくともGILで取得できる限り並行して実行されます)。
別の言語で別の方法がある場合は、試してみます。
システムに誤って損傷を与える可能性のあるもの(ファイルとシステムへのアクセス、インポートステートメント、exec()またはeval()へのネストされた呼び出しなど)へのアクセスを防ぐために、コードをクリーンアップする予定です。
私が検討したオプション
- exec()ステートメントはスレッドで実行されているため、ポイズンピルを使用してスレッドを強制終了します。残念ながら、私は毒薬がすべての場合に機能するとは限らないことを読みました。
- プロセス内でexec()ステートメントを実行してから、を使用
process.terminate()
してすべてを強制終了します。しかし、私はWindowsで実行しており、プロセスの作成にはコストがかかる可能性があることを読みました。また、これらすべてを管理しているコードとの通信が複雑になります。 - exec()ステートメント内に事前に記述された関数のみを許可し、それらの関数に終了フラグを定期的にチェックさせてから、必要に応じてクリーンアップを実行します。これは複雑で時間がかかり、考慮すべきコーナーケースが多すぎます。もっと簡単な解決策を探しています。
これは、「exec()ステートメントで任意のコードを実行できるようにしたいのはなぜですか?」というちょっと変わった質問に値することを私は知っています。応答のタイプ。私は少し自己進化するコードを試してみています。これが現時点での私の大きな障害です。コードにほとんど何でもできるようにすると、コードが永久にハングする可能性があります。どのようにして制御を取り戻し、制御を取り戻したときにそれを停止しますか?