2

私はPythonスレッドを作成します.1つはstart()メソッドを呼び出すことで実行するキックです.1つはスレッド内のフラグを監視します.そのflag == Trueの場合、ユーザーがスレッドを実行し続けることを望んでいないことがわかっているので、嘘をつきますハウスクリーニングを行い、スレッドを終了します。

ただし、スレッドを終了できませんでした。thread.join() 、 thread.exit() 、thread.quit() を試しましたが、すべて例外がスローされました。

私のスレッドは次のようになります。

EDIT 1 : core() 関数は標準の run() function 内で呼び出されることに注意してください。ここでは示していません。

EDIT 2 : StopFlag が true のときに sys.exit() を試してみたところ、スレッドが終了したように見えます! 一緒に行っても安全ですか?

class  workingThread(Thread):

    def __init__(self, gui, testCase):
        Thread.__init__(self)
        self.myName = Thread.getName(self)
        self.start()    # start the thread

    def core(self,arg,f) : # Where I check the flag and run the actual code

        # STOP
        if (self.StopFlag == True):
            if self.isAlive():

                self.doHouseCleaning()
                # none of following works all throw exceptions    
                self.exit()
                self.join()
                self._Thread__stop()
                self._Thread_delete()
                self.quit()

            # Check if it's terminated or not
            if not(self.isAlive()):
               print self.myName + " terminated " 



        # PAUSE                                                        
        elif (self.StopFlag == False) and not(self.isSet()):

            print self.myName + " paused"

            while not(self.isSet()):
                pass

        # RUN
        elif (self.StopFlag == False) and self.isSet():
            r = f(arg)            
4

2 に答える 2

3

ここにいくつかの問題がありますが、他の問題もある可能性がありますが、プログラム全体または特定の例外を表示していない場合、これが私ができる最善の方法です:

  1. スレッドが実行するタスクは、「ru​​n」と呼ばれるか、Thread コンストラクターに渡される必要があります。
  2. スレッドはそれ自体で join() を呼び出すのではなく、スレッドを開始した親プロセスが join() を呼び出し、スレッドが戻るまで親プロセスをブロックします。
  3. 通常、親プロセスは run() を呼び出す必要があります。
  4. スレッドは、run() 関数を終了する (から戻る) と完了します。

簡単な例:

import threading
import time

class MyThread(threading.Thread):

    def __init__(self):
        super(MyThread,self).__init__()
        self.count = 5

    def run(self):
        while self.count:
            print("I'm running for %i more seconds" % self.count)
            time.sleep(1)
            self.count -= 1

t = MyThread()
print("Starting %s" % t)
t.start()
# do whatever you need to do while the other thread is running
t.join()
print("%s finished" % t)

出力:

Starting <MyThread(Thread-1, initial)>
I'm running for 5 more seconds
I'm running for 4 more seconds
I'm running for 3 more seconds
I'm running for 2 more seconds
I'm running for 1 more seconds
<MyThread(Thread-1, stopped 6712)> finished
于 2012-09-29T01:12:02.240 に答える
0

スレッド インスタンスへの参照から、またはスレッド モジュールから、スレッドを強制終了する明示的な方法はありません。

そうは言っても、複数のスレッドを実行する一般的なユースケースでは、スレッドが無期限に実行されるのを防ぐ機会が与えられます。たとえば、 urllib2を介して外部リソースに接続している場合は、常にタイムアウトを指定できます。

import urllib2
urllib2.urlopen(url[, data][, timeout])

同じことがソケットにも当てはまります。

import socket
socket.setdefaulttimeout(timeout)

タイムアウトを指定してスレッドの join([timeout]) メソッドを呼び出すと、タイムアウトの間だけ (またはスレッドが終了するまで) ブロックされることに注意してください。スレッドは強制終了されません。

プログラムの終了時にスレッドが確実に終了するようにしたい場合は、スレッド オブジェクトのデーモン属性を必ず True に設定してから、その start() メソッドを呼び出してください。

于 2012-09-29T07:42:05.057 に答える