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 で上記のプログラムを実行すると、アプリケーションが終了して新しいプロセスが生成された後でも、プロセスが実行され続けることがわかります。スレッドが stdout に出力し続けるため、これが表示されます。行をコメントアウトしても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 に答える