線程啟動之後,會執行一個函數,當該函數執行完之後,線程也就結束了,該函數只被執行一次。
下面我以問題的形式,給出一些我的理解。
想讓線程不停地運行,該怎麼實現?一般有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();