2016-12-14 29 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