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

时间:2018-03-21 20:58:08

标签: python multithreading multiprocessing

关于进程类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()的方式是否有任何疯狂。

1 个答案:

答案 0 :(得分:1)

您似乎正在实施基本的重试方案。为此,您应该考虑将此委托给库,例如retrying。与您尝试在线程中实现重置'的逻辑相比,这可能是更好的方法。它

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

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