【问题标题】:stop threads when exception happen发生异常时停止线程
【发布时间】:2013-03-31 15:10:52
【问题描述】:

我有 10 个线程,问题是当发生错误引发异常时,bye 将被打印 10 次。

我只想打印一次,然后终止所有线程。有什么解决办法吗?

from threading import Thread
def printmsg(msg,threadNumber):
    while True:
        try:
            print 'this is your message %s -- Thread Number:%s'%(msg,threadNumber)
        except:
              exit('Bye')

for i in range(0,11):
    Thread(target=printmsg,args=('Hello Wrold',str(i))).start()

【问题讨论】:

  • 您的示例代码中的语法错误是否故意引发异常?
  • 嗯,你已经修好了。
  • 顺便说一下,您正在启动 11 个线程,而不是 10 个。检查您的间隔逻辑。

标签: python multithreading exit terminate


【解决方案1】:

您可以在线程中设置一个标志。在主循环中,您可以依次join()所有线程以等待它们消失,然后在设置标志时打印一条消息。

标志甚至可以是异常的值...

【讨论】:

    【解决方案2】:
    from threading import Thread, Lock
    
    stop = False
    lock = Lock()
    
    def printmsg(msg, threadNumber):
        global stop
        while True:
            try:
                if threadNumber in [3, 5, 7, 9]: # Something wrong happens
                    raise NotImplementedError
    
                lock.acquire()
                if stop:
                    lock.release()
                    break
                print 'This is your message %s -- Thread Number: %s' % (msg, threadNumber)
                lock.release()
            except NotImplementedError:
                lock.acquire()
                if not stop:
                    stop = True
                    print 'Bye'
                lock.release()
                break
    
    for i in range(0,11):
        Thread(target=printmsg, args=('Hello World', i)).start()
    

    【讨论】:

      【解决方案3】:

      尝试通过主线程加入所有子线程。并在主线程中完成您的工作。

      #-*-coding:utf-8-*-
      
      from threading import Thread
      
      def printmsg(msg,threadNumber):
          while True:
              try:
                  print 'this is your message %s -- Thread Number:%s'%(msg,threadNumber)
                  raise
              except:
                  break
      
      if __name__ == '__main__':
          threads = []
          for i in range(0,11):
              threads.append(Thread(target=printmsg,args=('Hello Wrold',str(i))))
          for t in threads:
              t.start()
          for t in threads:
              t.join()
          exit('Bye')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多