2016-12-14 57 views
0

有时一个Python程序与类似以下的异常停止,当没有足够的内存:如何让Python在无法分配内存时等待?

OSError: [Errno 12] Cannot allocate memory 

我可以让它等到内存可用,而不是再次死于无法恢复的? 或者至少冻结,直到用户发送一个SIGCONT或什么东西给它?

这不是我的程序,所以我不想修改它的源代码,但我认为如果我可以通过修改最外层的调用部分来做到这一点,它仍然很酷。

谢谢!

+0

你是否愿意做低级编程,比如编写一个C库来使用'LD_PRELOAD'?或者你想要一个纯粹的Python解决方案?这是在Linux上吗? –

+0

@JohnZwinck感谢您的评论。其实我不想做像hook这样的底层事情。所以纯粹的Python解决方案会更好。是的,它在Ubuntu上。 – noname

+0

@JohnZwinck为了澄清,“我不想做低级别的事情”,我的意思是我不想在这个项目中插入低级别的东西。如果它足够可靠,我想它会好起来的。 – noname

回答

2

您可以捕获OSError异常,但这可能无法帮助您的程序继续停止。

为了做到这一点,您需要在Python和malloc之间插入一些代码。你可以做,使用LD_PRELOAD按照这里的细节:How can I limit memory acquired with `malloc()` without also limiting stack?

的想法是你实现一个包装器malloc这就要求真正malloc和等待,如果它不能重试。如果您不想使用LD_PRELOAD,那么使用插入代码来构建Python是一种可能(但还有更多工作)。

您将为LD_PRELOAD编写的库最终可用于任何用C或C++编写的程序。你甚至可以开源。 :)

+3

注意:您不需要在现代Python上包装'malloc'本身;在3.4及更高版本中,[PEP 445](https://www.python.org/dev/peps/pep-0445/)提供了API以取代Python用于任意目的的默认分配器。没有实际的保证,Python最终完全转向了'malloc'(小对象分配器使用可以直接通过'mmap'获取的竞技场),所以这些钩子和PEP保证是很重要的。 – ShadowRanger