关于杀死使用过多内存的进程之前我已经问过这个问题,而且我已经解决了大部分问题.
然而,有一个问题:计算大量数字似乎不受我试图使用的方法的影响.下面的代码旨在为进程设置10秒的CPU时间限制.
import resource
import os
import signal
def timeRanOut(n, stack):
raise SystemExit('ran out of time!')
signal.signal(signal.SIGXCPU, timeRanOut)
soft,hard = resource.getrlimit(resource.RLIMIT_CPU)
print(soft,hard)
resource.setrlimit(resource.RLIMIT_CPU, (10, 100))
y = 10**(10**10)
Run Code Online (Sandbox Code Playgroud)
我希望在运行此脚本(在Unix机器上)时看到的是:
-1 -1
ran out of time!
Run Code Online (Sandbox Code Playgroud)
相反,我没有输出.我获得输出的唯一方法是使用Ctrl+ C,如果我在10秒后Ctrl+ 我得到这个C:
^C-1 -1
ran out of time!
CPU time limit exceeded
Run Code Online (Sandbox Code Playgroud)
如果I Ctrl+ C 在 10秒之前,那么我必须做两次,并且控制台输出如下所示:
^C-1 -1
^CTraceback (most recent call last):
File "procLimitTest.py", line 18, in <module> …Run Code Online (Sandbox Code Playgroud) 情况:我有一个网站,允许人们使用共享托管服务器上的Python解释器,以不同的语言(特别是我创建的esolang)执行任意代码.我在一个单独的进程中运行此代码,该进程的时间限制为60秒.
问题:你可以做类似(相当于Python)的东西10**(10**10),它会迅速消耗比我分配给我的更多的内存.显然,它也锁定了Apache - 或者响应时间太长 - 所以我必须重启它.
我已经看到了这个问题,但是给出的答案使用的是Perl,我完全不知道,因此我想在Python中找到答案.不过,操作系统也是 Linux.
具体来说,我想要以下特点:
我使用这段代码(在Django视图中)来创建进程并运行它(proxy_prgm是一个Manager,所以我可以从解释esolang代码的程序中检索数据):
prgmT[uid] = multiprocessing.Process(
target = proxy_prgm.runCatch,
args = (steps,),
name="program run")
prgmT[uid].start()
prgmT[uid].join(60) #time limit of 1 minute
if prgmT[uid].is_alive():
prgmT[uid].terminate()
proxy_prgm.stop()
Run Code Online (Sandbox Code Playgroud)
如果您需要更多详细信息,请不要犹豫,告诉我要编辑什么(或问我问题).
在我的Lua代码中(使用Corona SDK),我的问题基本归结为:
local function foo()
bar()
end
local function bar()
foo()
end
Run Code Online (Sandbox Code Playgroud)
但是,因为Lua是逐行完成的,所以没有机会工作.此外,我没有看到避免这种依赖循环的方法; foo()创建为触摸事件调用bar()的DisplayObjects,它本身具有调用foo()的能力.换句话说,我需要能够制作按钮,当点击它们时,制作更多可以做同样事情的按钮.
此外,我知道Lua没有像C/C++那样的函数原型.有关如何解决此问题的任何建议?