2013-07-31 61 views
0

以下是横跨几个线程Python应用程序,然后派生的本身和出口的新工艺:为什么线程在应用程序退出后继续运行?

from pprint import pprint import os 
import random 
import signal 
import sys 
import threading 
import time 


class Name(object): 
    def __init__(self, name): 
     self.name = name 


class CallThreads(threading.Thread): 
    def __init__(self, target, *args): 
     self.target = target 
     self.args = args 
     threading.Thread.__init__(self) 

    def run (self): 
     self.target(*self.args) 


def main(args): 
    print("Hello, world!") 
    letter = random.choice(['A', 'B', 'C', 'D', 'E', 'F']) 
    count = 0 
    while count<3: 
     count += 1 
     name = Name(letter+str(count)) 
     t = CallThreads(provider_query, name) 
     t.daemon = True 
     t.start() 
     time.sleep(3) 
     print("------------") 

    print("Time to die!") 
    os.system('python restart.py') 
    sys.exit(0) 


def provider_query(name): 
    while name.name!='': 
     print(name.name) 
     time.sleep(1) 


def signal_handler(signal, frame): 
    sys.exit() 


if __name__ == '__main__': 
    signal.signal(signal.SIGINT, signal_handler) 
    main(sys.argv) 

我想到的是,进程退出后,与之相关的线程将停止运作。但是,在Kubuntu Linux上运行上述程序会告诉我这些进程会继续运行,即使在应用程序退出并产生了新进程之后。我看到这个线程继续输出到标准输出。即使我注释掉daemon行,这些过程仍会继续运行。

为什么进程在sys.exit()被调用后继续运行,我该如何让它们停止?这个问题发生在Kubuntu Linux 12.10中的Python 2.7和Python 3.2上。

+0

'restart.py'是做什么用的?你确定你看到的输出不是来自那里吗? – interjay

回答

2

你从来没有对sys.exit()调用过。 os.system('python restart.py')阻止,直到restart.py完成 - 但那个孩子restart.py阻止另一个孩子restart.py,等等......直到你最终炸掉了进程表。您应该每9秒钟在进程表中看到另一个restart.py。

+0

谢谢!在另一个线程中运行'os.system'命令解决了这个问题。 – dotancohen

相关问题