python有嵌套的异常保护吗?

2024-09-27 09:29:38 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码:

def printlen(x): print(len(x))

def argslist(x): return list(x.args)

def add(value_error, arg): raise Exception(*value_error, *arg)

def fibonacci(a, b, x):
    try:
        assert b<x
        printlen(b)
        try:
            add(a,b)
        except Exception as e:
            fibonacci(argslist(e), a, x)
    except AssertionError as e:
        print(e)

threshold = 1000
fibonacci([[]],[[]],[[]]*threshold)

代码使用deftryexceptraise以及两个特殊函数打印从1到阈值的斐波那契数。 如果删除“assert b<;x”行或将阈值设置为非常大的数字,python.exe将接管公羊并冻结一切。 有没有一种机制来限制提升s、尝试s和s之外的其他内存,或者只是防止分配这么多内存?你知道吗


Tags: 代码addvaluedefexceptionargerrorassert
2条回答

will take over the RAM

从技术上讲,这是不可能的。你知道吗

RAM指的是物理内存和python.exe无法访问物理RAM。Windows中的可执行文件只能访问virtual memory (MSDN)。内存中有多少是由Windows决定的。你知道吗

对于32位Python,这应该不是什么大问题,因为它最多只能访问4gb。当然,对于64位,它将开始使用页面文件并写入磁盘,这使得速度变慢。这甚至会影响其他程序。有关详细信息,请参见memory limits (MSDN)

and freeze everything

而且,几乎不可能,因为Python不能以独占方式访问CPU。一种称为抢占的机制将确保Windows可以将CPU分配给其他对象。你知道吗

您发布的代码既不使用多线程也不使用多处理,因此它将只使用1个CPU。如果你有一台单核机器,那当然是100%。在我的机器上,它只有25%,其他一切都继续平稳运行:

25% CPU for Python

Isn't there a mechanism to limit nested raises, trys and excepts

我不这么认为。你知道吗

or just prevent so much memory from being allocated?

是的,在Windows中有一种叫做“Job (MSDN)”的机制可以做到这一点。你得跑了Python.exe在有内存配额的作业中。有一个Superuser question建议使用相应的工具。你知道吗

作为替代方案,您当然可以为fibunci序列实现一个内存限制条件来停止,如下所示:

import os
import psutil
process = psutil.Process(os.getpid())
ram = psutil.virtual_memory().total
ram_limit = 70 / 100 * ram

[...]

if process.memory_info().private > ram_limit:
    assert False

出于调试的原因,我使用了if,因此我可以在断言上放置一个断点来制作下面的屏幕截图。你知道吗

Python at memory limit

如您所见,私有字节(进程使用的内存)约为23.5 GB,工作集(适合计算机物理RAM的内存)也约为23.5 GB。到目前为止没有性能问题。你知道吗

不,没有这样的机制。Python尽可能地分配内存。当它变得不可能时,它会引发MemoryError。你知道吗

相关问题 更多 >

    热门问题