標籤:
一:多線程的建立
threading庫建立線程有兩種方式,函數式和繼承式
1)函數式
2)繼承式
class ThreadClass(threading.Thread):
def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):
threading.Thread.__init__(self, group, target, name, args, kwargs)
def run(self):
print ‘Starting‘
print ‘Ending‘
t = ThreadClass()
t.start()
Thread類的建構函式定義如下:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
group:留作ThreadGroup擴充使用,一般賦值NULL
target:就是建立線程要執行的任務函數名
name:線程的名字,也可使用getName(),setName()擷取或者修改
args:tuple參數
kwargs:dictionary參數
二:相關函數
1)start():啟動線程;
2)join():主線程阻塞住,等待調用該函數的線程結束。join的參數是一個數字,如果非零就表示在此時間後,如果調用join的線程沒有結束join函數也返回;
3)is_alive(), isAlive(),判斷線程是否結束;
4)setDaemon(),設定函數為守護線程
class ThreadClass(threading.Thread):
def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):
threading.Thread.__init__(self, group, target, name, args, kwargs)
def run(self):
while True:
dosometing()......
t = ThreadClass()
t.setDaemon(True)
t.start()
while True:
if not t.is_alive():
print "t is dead"
exit(1)
time.sleep(60)
t.join()
三:守護線程
守護線程的概念有點不同於Linux環境下的概念,可能是我沒理解,但是這個概念和Java裡的守護線程一樣:
守護線程在主線程退出後也會隨著退出,非守護線程則不會。什麼意思呢?
對於普通線程,如果線程的任務沒有結束,主線程不會退出,整個程式也不會退出;
對於守護線程,即使線程任務還沒有結束,如果主線程退出該線程也會退出;
(不知道這樣的理解對不對,實驗一下)
#--encoding=‘utf-8‘--
import logging
import threading
import time
logging.basicConfig(
level=logging.DEBUG,
format=‘(%(threadName)-10s) %(message)s‘,
)
def ThreadFunc():
logging.debug(‘ Starting‘)
file_object = open(‘thefile.txt‘, ‘w+‘)
while True:
file_object.write(‘wahaha\r\n‘)
file_object.flush()
time.sleep(1)
logging.debug(‘ Existing‘)
file_object.close( )
t=threading.Thread(name=‘ThreadFunc‘,target=ThreadFunc)
#t.setDaemon(True)
t.start()
time.sleep(5)
1)首先注釋掉d.setDaemon(True),也就是d是一個普通線程
執行之後,主線程本該在5秒後退出,但是卻發現該線程還是不斷的輸入wahaha,該指令碼一直運行直到kill掉改指令碼的執行。此時Ctrl+c也無效,只有kill。
2)刪除d.setDaemon(True)前面的#,也就是d是一個守護線程
執行之後,主線程在5秒後退出,線程d只輸出少於五個wahah之後也隨著主線程的退出而退出,整個指令碼退出。在退出前Ctrl+c有效。
Python多線程的建立,相關函數和守護線程的理解