首先了解幾個知識點(diǎn):
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、做網(wǎng)站、黃石網(wǎng)絡(luò)推廣、微信小程序、黃石網(wǎng)絡(luò)營銷、黃石企業(yè)策劃、黃石品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供黃石建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
一:當(dāng)一個進(jìn)程啟動之后,會默認(rèn)產(chǎn)生一個主線程,因?yàn)榫€程是程序執(zhí)行流的最小單元,當(dāng)設(shè)置多線程時,主線程會創(chuàng)建多個子線程,在python中,默認(rèn)情況下(其實(shí)就是setDaemon(False)),主線程執(zhí)行完自己的任務(wù)以后,就退出了,此時子線程會繼續(xù)執(zhí)行自己的任務(wù),直到自己的任務(wù)結(jié)束。
二:當(dāng)我們使用setDaemon(True)方法,設(shè)置子線程為守護(hù)線程時,主線程一旦執(zhí)行結(jié)束,則全部線程全部被終止執(zhí)行,可能出現(xiàn)的情況就是,子線程的任務(wù)還沒有完全執(zhí)行結(jié)束,就被迫停止。
三:此時join的作用就凸顯出來了,join所完成的工作就是線程同步,即主線程任務(wù)結(jié)束之后,進(jìn)入阻塞狀態(tài),一直等待其他的子線程執(zhí)行結(jié)束之后,主線程在終止。
join有一個timeout參數(shù):
1:當(dāng)設(shè)置守護(hù)線程時,含義是主線程對于子線程等待timeout的時間將會殺死該子線程,最后退出程序。所以說,如果有10個子線程,全部的等待時間就是每個timeout的累加和。簡單的來說,就是給每個子線程一個timeout的時間,讓他去執(zhí)行,時間一到,不管任務(wù)有沒有完成,直接殺死。
2:沒有設(shè)置守護(hù)線程時,主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結(jié)束,但是并沒有殺死子線程,子線程依然可以繼續(xù)執(zhí)行,直到子線程全部結(jié)束,程序退出。
先看個帶有參數(shù)的簡單的線程例子
def func1(a,b): print a,b t1 = Thread(target=func1, args=(1,2)) print "before...." t1.start() print t1.getName() #查看線程的名字 print "after...."
執(zhí)行結(jié)果
before.... 1Thread-1 2after....
默認(rèn)情況下,主線程會等待子線程執(zhí)行完成才結(jié)束,此時isDaemon函數(shù)值是False,我們可已查看
def fun(): for item in range(50): print item time.sleep(1) t2 = Thread(target=fun) print t2.isDaemon() t2.start() print "after" print "after" print "after" print "after end" time.sleep(10)
執(zhí)行結(jié)果,主線程會等待子線程完成才結(jié)束
False 0 after after after after end 1 2 3 4 .. ..
可設(shè)置setDaemon的值為True,使得主線程不等待子線程執(zhí)行完成,主線程執(zhí)行完畢不管子線程是否執(zhí)行完畢都會被終止執(zhí)行
def fun(): for item in range(50): print item time.sleep(1) t3 = Thread(target=fun) t3.setDaemon(True) t3.start() print "after" print "after" print "after" print "after end" time.sleep(5)
執(zhí)行結(jié)果,4被打印后程序就結(jié)束
0after after after after end 1 2 3 4
設(shè)置setDaemon 為True時,我們試試join的作用
def fun(): for item in range(50): print item time.sleep(1) t4 = Thread(target=fun) print "before" t4.setDaemon(True) t4.start() t4.join(5) print "after" print "after" print "after" print "after end"
執(zhí)行結(jié)果子線程執(zhí)行5條就被終止
before 0 1 2 3 4 after after after after end
不設(shè)置setDaemon時,即其值為False時,我們設(shè)置join看看效果
def fun(): for item in range(50): print item time.sleep(1) t4 = Thread(target=fun) print "before" #t4.setDaemon(True) t4.start() t4.join(5) print "after" print "after" print "after" print "after end"
執(zhí)行結(jié)果,會發(fā)現(xiàn)主線程會等待子線程完成才推出
before 0 1 2 3 4 after after after after end 5 6 .. ..