2012-08-13 63 views
2

我想在Python中創建一個腳本來學習線程和我似乎無法停止在線程循環。目前,我正在使用pyInstaller編譯腳本並結束Thread過程,我知道這不是最好的方法,任何人都可以向我解釋如何在命令上結束一個線程?我讀過很多其他問題,但我似乎無法理解如何以「正確」的方式阻止線程。下面是我使用截至目前,以測試它的代碼:如何在Python中的線程中停止for循環?

class Thread(Thread): 
     def __init__(self, command, call_back): 
     self._command = command 
     self._call_back = call_back 
     super(Thread, self).__init__() 

    def run(self): 
     self._command() 
     self._call_back() 
def test(): 
    i = 20 
    for n in range(0,i): 
     #This is to keep the output at a constant speed 
     sleep(.5) 
     print n 
def thread_stop(): 
    procs = str(os.getpid()) 
    PROCNAME = 'spam.exe' 
    for proc in psutil.process_iter(): 
     if proc.name == PROCNAME: 
      text = str(proc)[19:] 
      head, sep, tail = text.partition(',') 
      if str(head) != procs: 
       subprocess.call(['taskkill', '/PID', str(head), '/F']) 

的功能是由Tkinter的做了一個圖形用戶界面,這是罰款,現在叫。

如果你不想讀這一切,給點意見:我如何停止一個線程「正確的方式」時,有一個在Python中的線程循環?謝謝!

編輯:對不起,我把我認爲是最重要的代碼。相反,這裏是整個代碼(這是我用來學習Python的文本消息器,但是在開始介紹它之前,上面是我的第一次嘗試線程)。 http://pastebin.com/qaPux1yR

+0

這裏沒有什麼實際調用'測試()'。請分享完整的相關代碼。 – Amber 2012-08-13 06:03:49

+0

@Amber很抱歉,編輯了這篇文章。 – 2012-08-13 06:08:36

+0

你是否有殺死你的線程?你不能只發送他們的循環出口信號? – 2012-08-13 06:18:26

回答

6

你不應該強行殺死一個線程。而是使用線程定期檢查的某種「信號」,如果設置,線程就會很好地完成。

最簡單的一種「信號」的是一個簡單的布爾變量,並且可以使用這樣的事情:

class MyThread(Thread): 
    def __init__(self): 
     self.continue = True 

    def run(self): 
     while (self.continue): 
      # Do usefull stuff here 
      pass 

    def stop(self): 
     self.continue = False 
+0

我會在run()下移動我的代碼並將for循環更改爲一段時間嗎?類對我來說非常混亂,對.self和init的基本解釋也會有幫助,謝謝。 – 2012-08-13 06:37:15

+0

@有些程序員夥計是你在第3行「重寫子類中的構造函數方法」? – neoDev 2017-11-09 16:52:44