остановить потоки, когда произойдет исключение - PullRequest
2 голосов
/ 26 марта 2012

У меня 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()

Ответы [ 3 ]

1 голос
/ 26 марта 2012

Вы можете установить флаг в темах. В главном цикле вы можете join() все потоки подряд, чтобы дождаться их завершения и затем напечатать сообщение, если установлен флаг.

Флаг может даже быть значением исключения ...

0 голосов
/ 31 марта 2013

Попробуйте объединить все дочерние потоки с помощью основного потока. И делай свою работу в основной ветке.

#-*-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')
0 голосов
/ 26 марта 2012
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()
...