我有一个python方法,可以不时执行某些任务。 我发现最简单的方法是写:
class MyClass:
def a(self):
#perform the task
time.sleep(time_to_sleep)
self.a()
但该方法应该运行很长时间,可能持续数月,这意味着它可以递归调用方法达10 ^ 4次。
这样做有风险吗?
答案 0 :(得分:6)
如果您无限期地继续进入您的函数,迟早会出现以下错误 -
RuntimeError: maximum recursion depth exceeded
一个简单的例子来展示这个 -
>>> def a():
... global i
... i += 1
... a()
然后我使用as -
运行此功能>>> i = 0
>>> a()
这给了我上面的错误,之后当我打印i
的值时它是999.所以迟早你会得到那个错误。
您也可以通过调用sys.setrecursionlimit()
来更改此限制,但我不会建议这样做,因为您可能会在达到限制之前结束堆栈(更简单的方法是使用while循环如下面答案中所示) -
import sys
sys.setrecursionlimit(<limit>)
或者你也可以得到 - MemoryError
- 如果你在本地命名空间中存储大量数据,因为你永远不会从递归调用中返回,所以调用函数的本地命名空间永远不会被清除。所以,在你达到最大递归限制之前,你甚至可以最终炸毁你的记忆。
您尝试做的简单方法是使用while循环,例如 -
class MyClass:
def a(self):
while True:
#perform the task
time.sleep(time_to_sleep)
答案 1 :(得分:4)
都能跟得上!
递归函数有一个调用限制。如证明,您可以看到自己修改sys.setrecursionlimit:
import time, sys
# max calls: 3
sys.setrecursionlimit(3)
class MyClass:
def a(self):
print "."
time.sleep(1)
self.a()
m = MyClass()
m.a()
当通话次数达到3时,您可以看到: RuntimeError:
.
.
Traceback (most recent call last):
File "teste.py", line 14, in <module>
m.a()
File "teste.py", line 11, in a
self.a()
File "teste.py", line 11, in a
self.a()
RuntimeError: maximum recursion depth exceeded
只是为了注意你可以得到这样的递归限制:
>>> import sys
>>> sys.getrecursionlimit()
另外,请注意:如果设置得太高而且太高了 sys.getrecursionlimit(),您可能会导致C堆栈溢出, 使Python解释器失败。