Установка размера стека в скрипте 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
, но я не знаю, будет ли это правильно наследоваться подпроцессами. Этот интерфейс также требует определенного размера стека - "без ограничений" не вариант.