線程啟動之後,會執行一個函數,當該函數執行完之後,線程也就結束了,該函數只被執行一次。
下面我以問題的形式,給出一些我的理解。
想讓線程不停地運行,該怎麼實現?一般有2種方法:
(1)在該線程執行的函數中,設定一個死迴圈,即while true。當線程調用該函數時,則該函數就會陷入了死迴圈。當滿足某種條件之後,可以通過break退出該迴圈。本blog中介紹的“雙線程高效下載問題”和“多線程概述”中給出的代碼,都是這種方法。
(2)重寫線程中的run方法中,設定一個死迴圈,即while true,其他和方法一類似。
那如何?每隔一段時間執行一次線程,即線程定時觸發執行?
可以通過線上程的迴圈中設定一個sleep方法,如time.sleep(30),則該線程每隔30秒之後就休眠,放棄cpu的使用權,30秒之後,再加入線程隊列,等待調用。即實現了我們的定時觸發線程的效果。
python使用線程是非常方便的,通過調用threading模組就可以立刻使用。
下面給出一個python中thread的demo,可以複製,然後儲存就可以運行。該demo是通過重寫run方法,在run中使用while true來迴圈,並在run中使用sleep(30),來實現定時觸發。
#!/usr/bin/python# -*-coding:utf-8 -*-import sys;import os;import time;import threading;class MTimerClass(threading.Thread): # cookie監控時鐘 def __init__(self,fn,args=(),sleep=1): threading.Thread.__init__(self) self.fn = fn self.args = args self.sleep = sleep self.setDaemon(True) self.isPlay = True #當前是否運行 self.fnPlay = False #當前已經完成運行 self.thread_stop=False; def SetSleep(self,sleep): # 重新設定 時間間隔 self.sleep=sleep; def __do(self): self.fnPlay = True; apply(self.fn,self.args); self.fnPlay = False def run(self): while self.isPlay : if self.thread_stop==True: break; #if SubCommon.ifexeStop==True: #可以外部調用 來關掉線程。 # print 'thread break' # break; #print self.sleep; time.sleep(self.sleep) self.__do(); def stop(self): #stop the loop self.thread_stop = True; self.isPlay = False; while True: if not self.fnPlay : break time.sleep(0.01)def GetSearchinfo(): print 'hhhhh...'; # to do pass; def main(): tCheck=MTimerClass(GetSearchinfo, '', 60); tCheck.setDaemon(True); # 隨主線程一起結果 tCheck.start(); #線程啟動if __name__== "__main__": main();