我的脚本接受 Python 代码的任意长度和内容字符串,然后在 exec() 语句中运行它们。如果运行任意代码的时间超过了某个预定限制,则 exec() 语句需要退出,并且需要设置一个布尔标志以指示已发生过早退出。
如何实现?
附加信息
这些代码将在多个线程中并行运行(或至少与 GIL 一样并行)。
如果有另一种语言的替代方法,我愿意尝试一下。
我计划清理代码以防止访问任何可能意外损坏我的系统的内容(文件和系统访问、导入语句、对 exec() 或 eval() 的嵌套调用等)。
我考虑过的选项
- 由于 exec() 语句在线程中运行,因此请使用毒丸杀死线程。不幸的是,我读到毒丸不适用于所有情况。
- 在进程内运行 exec() 语句,然后
process.terminate()
用于杀死所有内容。但是我在 Windows 上运行,并且我已经读过进程创建可能很昂贵。它还使与管理所有这些的代码的通信变得复杂。 - 只允许在 exec() 语句中预先编写函数,并让这些函数定期检查退出标志,然后根据需要执行清理。这既复杂又耗时,而且要考虑的极端情况太多;我正在寻找一个更简单的解决方案。
我知道这是一个有点奇怪的问题,值得提出“为什么要允许任意代码在 exec() 语句中运行?” 响应类型。我正在尝试一些自我进化的代码。这是我目前的主要绊脚石:如果你允许你的代码做几乎任何事情,那么它可能会永远挂起。你如何重新获得控制权并在它发生时阻止它?