2013-04-02 56 views
1

我正在寻找一种通过使用sys.exit()来终止线程的方法。我有两个函数add1()subtract1(),它们分别由每个线程t1t2执行。我想在完成add1()t2完成subtract1()后终止t1。我可以看到sys.exit()这样做。这样做可以吗?使用sys.exit()终止python线程

import time, threading,sys 

functionLock = threading.Lock() 
total = 0; 

def myfunction(caller,num): 
    global total, functionLock 

    functionLock.acquire() 
    if caller=='add1': 
     total+=num 
     print"1. addition finish with Total:"+str(total) 
     time.sleep(2) 
     total+=num 
     print"2. addition finish with Total:"+str(total) 

    else: 
     time.sleep(1) 
     total-=num 
     print"\nSubtraction finish with Total:"+str(total) 
    functionLock.release() 

def add1(): 

    print '\n START add' 
    myfunction('add1',10) 
    print '\n END add' 
    sys.exit(0) 
    print '\n END add1'   

def subtract1(): 

    print '\n START Sub' 
    myfunction('sub1',100) 
    print '\n END Sub' 
    sys.exit(0) 
    print '\n END Sub1' 

def main():  
    t1 = threading.Thread(target=add1) 
    t2 = threading.Thread(target=subtract1) 
    t1.start() 
    t2.start() 
    while 1: 
     print "running" 
     time.sleep(1) 
     #sys.exit(0) 

if __name__ == "__main__": 
    main() 
+1

'sys.exit'函数关闭整个解释器。你应该使用别的东西。 – Bakuriu

+0

你不应该寻找一种杀死线程的方法。当涉及I/O时(而不仅仅是),它可能会导致严重的问题。相反,你应该通知你的线程,你希望它完成任何正在做和放弃的事情。 – freakish

回答

2

sys.exit()真的只能引发SystemExit例外,它只是退出,如果它是所谓的主线程的程序。您的解决方案“有效”,因为您的线程不捕获SystemExit异常并因此终止。我建议你坚持一个类似的机制,但使用你自己创建的异常,以使其他人不会被非标准的sys.exit()(它并不真正退出)所困惑。

class MyDescriptiveError(Exception): 
    pass 

def my_function(): 
    raise MyDescriptiveError()