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