关于进程类MyProcessClass的以下代码,有时我想重新运行所有self.run任务。
self.run(retry = True)是我用来重新运行类中的run(self)任务的东西。它允许我随时随地从任何类函数重新运行进程类run(self)的任务。
MyProcessClass(Process):
def __init__(self):
Process.__init__(self)
#gets called automatically on class initialization
#process.start().
#it also gets called when a class function calls
#self.run(retry=True)
def run(self,end=False,retry=False):
if end==True:
sys.exit()
elif retry==True:
redo_prep()
do_stuff()
#represents class functions doing stuff
def do_stuff():
#stuff happens well
return
#stuff happens and need to redo everything
self.run(retry=True)
我不希望线程/进程结束,但我想重新运行所有内容。这会导致问题,因为run函数是递归调用的,我一次运行数百个这些进程类对象。当所有内存都在运行时,该框会占用大约32GB的内存。只有需要重新运行的对象才会被重新运行。
我的目标是在需要时重新运行self.run任务,或者如果需要从类中的任何地方结束线程,无论是16个函数深度还是2.从某种意义上说,我正在重置线程的任务,因为我知道重置内部的线程不起作用。我从How to close a thread from within?看到了有关“重置”线程的其他想法。我正在寻找处理重新运行类self.run任务的最pythonic方式。
我通常在整个课程中使用try-catch:
def function():
while True:
try:
#something bad
except Exception as e:
#if throttle just wait
#otherwise, raise
else:
return
附加问题:如果我要引发自定义异常以触发重试模块的@retry,我是否需要重新加注?这比上面的例子更多或更少pythonic?
我的脚本以我以前从未见过的方式被废弃了,我担心调用self.run(retry = True)会导致它执行此操作。我试图看看我在进程类中调用self.run()的方式是否有任何疯狂。
答案 0 :(得分:1)
您似乎正在实施基本的重试方案。为此,您应该考虑将此委托给库,例如retrying
。与您尝试在线程中实现重置'的逻辑相比,这可能是更好的方法。它
通过引发/重试特定异常,您应该能够使用retrying
干净地实现正确的错误处理逻辑。作为最佳实践,您应尽可能避免广泛的例外情况并捕捉特定的例外情况。
考虑一种模式,即线程本身不需要知道它是否需要重置'或重新启动。相反,如果可能,尝试让您的线程返回一些值或异常信息,以便主线程可以决定是否重新排队任务。