是否通过调用 self.run() pythonic 来重置 Python 线程/进程任务?



关于进程类MyProcessClass下面的代码,有时我想重新运行所有self.run任务。

self.run(retry=True)是我用来重新运行类中的run(self)任务的。它允许我随时从任何类函数从任何我想去的地方重新运行进程类运行(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 个。从某种意义上说,我正在重置线程的任务,因为我知道从内部重置线程是行不通的。我已经看到了有关"重置"线程的其他想法 如何从内部关闭线程?.我正在寻找处理重新运行类self.run任务的最python方法。

我通常在全班中使用 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() 的方式是否有任何疯狂之处。

看起来您正在实现一个基本的重试方案。为此,您应该考虑将其委托给库,例如retrying。与您尝试在线程中实现以"重置"它的逻辑相比,这可能是一种更好的方法。

通过引发/重试特定异常,您应该能够使用retrying干净地实现正确的错误处理逻辑。作为最佳实践,应避免广泛的例外情况,并尽可能捕获特定的异常。

考虑一种模式,其中线程本身不需要知道它是否需要"重置"或重新启动。相反,如果可能,请尝试让线程返回一些值或异常信息,以便主线程可以决定是否对任务重新排队。

最新更新