Python之線程

首先了解幾個知識點:

一:當一個進程啓動之後,會默認產生一個主線程,因爲線程是程序執行流的最小單元,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下(其實就是setDaemon(False)),主線程執行完自己的任務以後,就退出了,此時子線程會繼續執行自己的任務,直到自己的任務結束。

二:當我們使用setDaemon(True)方法,設置子線程爲守護線程時,主線程一旦執行結束,則全部線程全部被終止執行,可能出現的情況就是,子線程的任務還沒有完全執行結束,就被迫停止。

三:此時join的作用就凸顯出來了,join所完成的工作就是線程同步,即主線程任務結束之後,進入阻塞狀態,一直等待其他的子線程執行結束之後,主線程在終止。

       join有一個timeout參數:
            1:當設置守護線程時,含義是主線程對於子線程等待timeout的時間將會殺死該子線程,最後退出程序。所以說,如果有10個子線程,全部的等待時間就是每個timeout的累加和。簡單的來說,就是給每個子線程一個timeout的時間,讓他去執行,時間一到,不管任務有沒有完成,直接殺死。
            2:沒有設置守護線程時,主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結束,但是並沒有殺死子線程,子線程依然可以繼續執行,直到子線程全部結束,程序退出。


先看個帶有參數的簡單的線程例子

def func1(a,b):
    print a,b
    
    
t1 = Thread(target=func1, args=(1,2))

print "before...."
t1.start()
print t1.getName()  #查看線程的名字
print "after...."

執行結果

before....
1Thread-1 
2after....


默認情況下,主線程會等待子線程執行完成才結束,此時isDaemon函數值是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)

執行結果,主線程會等待子線程完成才結束

False
0
 after
after
after
after end
1
2
3
4
..
..


可設置setDaemon的值爲True,使得主線程不等待子線程執行完成,主線程執行完畢不管子線程是否執行完畢都會被終止執行

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)

執行結果,4被打印後程序就結束

0after
after
after
after end
1
2
3
4


設置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"

執行結果子線程執行5條就被終止

before
0
1
2
3
4
after
after
after
after end


不設置setDaemon時,即其值爲False時,我們設置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"

執行結果,會發現主線程會等待子線程完成才推出

before
0
1
2
3
4
after
after
after
after end
5
6
..
..


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章