代码之家  ›  专栏  ›  技术社区  ›  slumtrimpet

穿线。使用基本清理控件终止长时间运行的任务的计时器

  •  1
  • slumtrimpet  · 技术社区  · 6 年前

    我想监控一个进程,如果它运行超过N秒,我会自动终止它。

    我编辑此问题是为了回应以下建议: Is there any way to kill a Thread in Python?

    我认为我的问题略有不同,因为我专注于线程完成后的基本清理(这实际上可能比前面提到的可能的重复更加困难,因为每个人似乎都说这是不可能的)。

    作为一个简单的测试,我正在尝试以下操作,以尝试在2秒后终止该进程:

    import threading
    import sys
    import time
    
    def after_timeout():
      print "KILL THE WORLD HERE!"
      # whats the secret sauce here (if any)?
      # sys.exit() and other variants aren't
      # killing the main thread... is it possible?
    
    threading.Timer(2, after_timeout).start()
    
    i = 0
    while True:
      print i
      i += 1
      time.sleep(1)
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   slumtrimpet    6 年前

    所以我想可能已经解决了这一问题,通过组合10个不同的SO帖子,以一种我在任何一个SO帖子上都没有见过的方式。。。请批评并告诉我这是愚蠢还是聪明…;-)

    [因为这个问题与至少两个其他问题密切相关……我已将我提出的解决方案作为独立答案发布在两个相关的帖子中: 1 2 ]

    import threading
    import time
    import atexit
    
    def do_work():
    
      i = 0
      @atexit.register
      def goodbye():
        print ("'CLEANLY' kill sub-thread with value: %s [THREAD: %s]" %
               (i, threading.currentThread().ident))
    
      while True:
        print i
        i += 1
        time.sleep(1)
    
    t = threading.Thread(target=do_work)
    t.daemon = True
    t.start()
    
    def after_timeout():
      print "KILL MAIN THREAD: %s" % threading.currentThread().ident
      raise SystemExit
    
    threading.Timer(2, after_timeout).start()
    

    产量:

    0
    1
    KILL MAIN THREAD: 140013208254208
    'CLEANLY' kill sub-thread with value: 2 [THREAD: 140013674317568]
    

    我想这就是我申请的秘方。我的子线程在一段固定的时间后被正确清理,在所述子线程内没有循环标志检查无意义。。。我甚至可以在子线程中获得一点控制,在那里我可以进行一些最终状态检查和清理。