2013-04-02 92 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()