【问题标题】:Python instruction countingPython指令计数
【发布时间】:2013-03-06 19:38:25
【问题描述】:

是否有可能有一些函数在函数中的每条指令上运行一个计数器递增,并在达到一个数字时执行一些行为?

解释一下,如果一个函数最终占用了虚拟机中一定数量的字节码指令,我希望能够引发异常。因此,如果有人创建了一个列表推导式,它会产生一个无限循环,或者创建一个无限 while 循环,它会提前强制中断。

这可以在 Python 中完成吗?

【问题讨论】:

  • dis 模块可能会派上用场:docs.python.org/2/library/dis.html
  • @delnan 它完全相关。试图以编程方式确定无限循环是无法计算的。我的观点是这不是防止永无止境的代码的有效方法。它只能通过严格限制可以在函数中完成的工作量来起作用,无论天气如何,代码是否正在做重要的工作。
  • @gbtimmon 是的,但这不是我们在这里所做的。我们不分析程序或尝试确定它是否完全停止,我们让它运行并(尝试)在它执行超过一定(有限)数量的指令时杀死它。
  • 有一些字节码级别的技巧one can pull 但我无法想象将它们用于生产目的。如果您想编写一些安全的任务服务器,最好尝试使用 PyPy 的沙盒工具。

标签: python instructions


【解决方案1】:

我对此表示怀疑。通常,唯一可靠的方法是在单独的进程中运行不受信任的代码,并适当地沙盒。

考虑一下,如果不受信任的代码获取了一些关键资源(例如锁),然后由于耗时过长而被杀死,会发生什么情况。如果有人试图获取相同的锁,整个过程将陷入僵局。

【讨论】:

  • OP 想要引发异常,这将允许任何未损坏的清理代码运行。当然,它也很容易允许吞下异常并继续进行。这只是强调这是一个难题,并且可能涉及单独的过程。
  • 当然,它可以允许吞下异常并继续。如果那是有害的,那是我没有考虑到它的错。如果异常处理代码被破坏,它应该像正常的破坏代码一样工作——也就是说,引发它自己的异常,或者如果它产生一个异常,就会陷入无限循环,因为它不会在指令计数代码中。
  • 现在我已经有了更多经验,我得出的结论是这个答案是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多