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 上。

4

1 回答 1

2

你从来没有参加过 sys.exit() 电话。os.system('python restart.py')阻塞直到restart.py完成 - 但是那个子restart.py阻塞另一个子restart.py,等等......直到你最终炸毁进程表。您应该大约每 9 秒在进程表中看到另一个 restart.py。

于 2013-07-31T17:38:00.233 回答