Установка размера стека в скрипте Python

Я конвертирую скрипт csh в скрипт на python. Сценарий вызывает исполняемый файл с интенсивным использованием памяти, который требует очень большого стека, поэтому сценарий csh устанавливает размер стека неограниченным:

limit stacksize unlimited

Когда я пытаюсь воспроизвести этот скрипт на python, я выполняю их очень наивно, используя os.systemНапример:

os.system('some_executable')

Но я не знаю, как сказать ОС запускать эти исполняемые файлы с неограниченным размером стека. Есть ли способ указать размер стека для вызовов в скрипте Python? Есть ли какой-нибудь системный вызов низкого уровня, который я должен использовать? И есть ли модуль (похожий на shutil), который контролирует это?

4 ответа

Решение

Вы можете просто использовать команду (u)limit вашей оболочки, если хотите:

os.system('ulimit -s unlimited; some_executable')

Или (возможно, лучше) использовать resource.setrlimit:

resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))

У меня есть хороший опыт работы со следующим кодом. Не требует каких-либо специальных разрешений пользователя:

import resource, sys
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)

Однако, похоже, не работает с pypy.

Вы ищете интерфейс Python setrlimit, resource.RLIMIT_STACK,

Обратите внимание, что обычные пользователи не могут поднять свои жесткие ограничения, только root (ну, процесс с CAP_SYS_RESOURCE возможности (см. возможности (7)) процессов могут поднять свои пределы; поэтому вам может понадобиться использовать PAM pam_limits(8) limits.conf(5) файл, чтобы поднять жесткие ограничения для рассматриваемых пользователей.

Вы можете изменить размер стека текущего процесса через thread.stack_size, но я не знаю, будет ли это правильно наследоваться подпроцессами. Этот интерфейс также требует определенного размера стека - "без ограничений" не вариант.

Другие вопросы по тегам