0

私は、Python 3.4から、スレッドのさまざまなサブスレッドを起動するプログラムThreadを起動しています。Python:Kill Thread

私はメインスレッドを終了し、再度起動したいと思います。

これは非常に難しい作業です。誰かがThreadの代わりにmultiprocessing.ProcessProcess.terminate()を使用することを提案する前に、私の実際のプログラムはすべてのスレッドとサブスレッドと共通の共有を共有しなければならないため、このルートには行くことができません。

現在、私はそれがsys.exit()を使用して終了する必要があることをメインスレッドに知らせるためにQueueを使用していますが、あなたは以下を参照することができますので、これは、動作しません。代わりにos._exit(0)を試しましたが、それはインタープリタ全体を殺します。

STARTING  
1...   
2...   
1...   
2...   
2...   
1...   
1...   
2...   
2...   
1...   
KILLING  
EXITING THREAD 
2...   
1...   
1...   
2...   
2...   
1...   
2...   
1...   
STARTING  
2...   
1...   
2...   
1...   
2...   
1...   
2...   
1...   
2...   
1...   
1...   
2...   
1...   
2...   
1...   

私は終了し、再度起動し、すべてのサブスレッドを含め、メインスレッドをしたい:

import sys 
import time 
from threading import Thread 
from queue import Queue 

t = None 
q = None 


def subthread1(): 
    while True: 
     time.sleep(2) 
     print(' 1...') 


def subthread2(): 
    while True: 
     time.sleep(2) 
     print(' 2...') 


def main_thread(q): 

    t1 = Thread(target=subthread1) 
    t1.daemon = True 
    t1.start() 

    t2 = Thread(target=subthread2) 
    t2.daemon = True 
    t2.start() 

    while True: 
     msg = q.get() 

     if msg == 0: 
      print("EXITING THREAD") 
      sys.exit() 


def start(): 
    print("STARTING") 
    global q, t 
    q = Queue() 
    t = Thread(target=main_thread, args=(q,)) 
    t.start() 


def kill(): 
    print("KILLING") 
    global q, t 
    q.put(0) 


def main(): 
    start() 
    time.sleep(10) 
    kill() 
    time.sleep(10) 
    start() 


if __name__ == '__main__': 
    main() 

これは、出力が生成されます。どうすればこれを達成できますか?私の実際のプログラムでは、サブスレッドにはサブスレッド(すべてのデーモン)があります。どのような助けが大いに感謝!

答えて

2

サブスレッドに停止を指示する方法が必要です。私は単にbreakの代わりsys.exit()を使用しますが、それはどちらかの方法で動作

def subthread1(stop): 
    while not stop: 
     time.sleep(1) 
     print(' 1...') 

def main_thread(q): 
    stop = [] # list rather than boolean because we need it "by reference" 

    t1 = Thread(target=subthread1, args=(stop,)) 
    t1.daemon = True 
    t1.start() 

    while True: 
     msg = q.get() 
     if msg == 0: 
      print("EXITING THREAD") 
      stop.append(True) 
      break 

注:私はそれをこのようにしてください。サブスレッドがクリーンアップするのを待つ場合は、t1.join()main_thread()出口より前に実行することも考えてください。

+0

作品!素晴らしい簡単な解決策 – baconwichsand