最簡單的狀況是:html
import threading import time def fuction(i): print("我是第%s個進程,開始時間是%s"%(i+1,time.ctime())) time.sleep(2) #子程序等2秒。。 print("我是第%s個進程,結束時間是%s"%(i+1,time.ctime())) threads=[threading.Thread(target=fuction,args=(i,) ) for i in range(5)] for t in threads: t.start() print("程序結束,%s:"%(time.ctime())) #輸出爲------------------- 我是第1個進程,開始時間是Sun Oct 22 17:45:37 2017 我是第2個進程,開始時間是Sun Oct 22 17:45:37 2017 我是第3個進程,開始時間是Sun Oct 22 17:45:37 2017 我是第4個進程,開始時間是Sun Oct 22 17:45:37 2017 我是第5個進程,開始時間是Sun Oct 22 17:45:37 2017 **程序結束,Sun Oct 22 17:45:37 2017:** #主線程繼續執行,不等待,也不殺死子線程 我是第1個進程,結束時間是Sun Oct 22 17:45:39 2017 我是第2個進程,結束時間是Sun Oct 22 17:45:39 2017 我是第5個進程,結束時間是Sun Oct 22 17:45:39 2017 我是第3個進程,結束時間是Sun Oct 22 17:45:39 2017 我是第4個進程,結束時間是Sun Oct 22 17:45:39 2017
這裏介紹另外兩個函數:setDaemon()、join()
join:如在一個線程B中調用threada.join(),則threada結束後,線程B纔會接着threada.join()日後運行。
setDaemon:主線程A啓動了子線程B,調用b.setDaemaon(True),則主線程結束時,會把子線程B也殺死,與C/C++中得默認效果是同樣的。python
好比我想讓主程序等待子程序完成以後再運行,能夠是用t.join()
其中t是指某個子進程,如t1,t2....而後join()能夠有一個參數,主進程等待多少秒,如t1.join(2)指在t1子進程開始後,主進程等待2秒就繼續執行。多線程
def fuction(i): print("我是第%s個進程,開始時間是%s"%(i+1,time.ctime())) time.sleep(i*2) #模擬子進程的運行時間,ID越大時間越長 print("我是第%s個進程,結束時間是%s"%(i+1,time.ctime())) threads=[threading.Thread(target=fuction,args=(i,) ) for i in range(5)] for t in threads: t.start() threads[1].join(1) #主進程在第二個子進程開始後阻塞1秒再運行 print("主進程:,%s:"%(time.ctime())) #輸出--------------------- 我是第1個進程,開始時間是Sun Oct 22 18:12:14 2017 我是第1個進程,結束時間是Sun Oct 22 18:12:14 2017 我是第2個進程,開始時間是Sun Oct 22 18:12:14 2017 #第二個子進程14秒開始 我是第3個進程,開始時間是Sun Oct 22 18:12:14 2017 我是第4個進程,開始時間是Sun Oct 22 18:12:14 2017 我是第5個進程,開始時間是Sun Oct 22 18:12:14 2017 主進程:Sun Oct 22 18:12:15 2017: #主進程在阻塞一秒後的15秒開始啓動運行 我是第2個進程,結束時間是Sun Oct 22 18:12:16 2017 我是第3個進程,結束時間是Sun Oct 22 18:12:18 2017 我是第4個進程,結束時間是Sun Oct 22 18:12:20 2017 我是第5個進程,結束時間是Sun Oct 22 18:12:22 2017
若想等全部的子進程都完成後,主進程在進行能夠,簡單狀況能夠用最慢的一個子進程來對主進程進行阻塞,這裏最慢的是第5個子進程。能夠:threads[4].join()。dom
import tensorflow as tf import numpy as np import random import threading import time def fuction(i): print("我是第%s個進程,開始時間是%s"%(i+1,time.ctime())) time.sleep((i+0.5)*2) #模擬子程序運行隨機秒 print("我是第%s個進程,結束時間是%s"%(i+1,time.ctime())) threads=[threading.Thread(target=fuction,args=(i,) ) for i in range(5)] for t in threads: t.start() threads[4].join() print("主進程:%s:"%(time.ctime())) #輸出----------------------- 我是第1個進程,開始時間是Sun Oct 22 18:29:28 2017 我是第2個進程,開始時間是Sun Oct 22 18:29:28 2017 我是第3個進程,開始時間是Sun Oct 22 18:29:28 2017 我是第4個進程,開始時間是Sun Oct 22 18:29:28 2017 我是第5個進程,開始時間是Sun Oct 22 18:29:28 2017 我是第1個進程,結束時間是Sun Oct 22 18:29:29 2017 我是第2個進程,結束時間是Sun Oct 22 18:29:31 2017 我是第3個進程,結束時間是Sun Oct 22 18:29:33 2017 我是第4個進程,結束時間是Sun Oct 22 18:29:35 2017 我是第5個進程,結束時間是Sun Oct 22 18:29:37 2017 主進程:Sun Oct 22 18:29:37 2017: #主進程等到最後一個子進程結束後才運行
另外一種狀況是,好比我想讓主程序運行完就馬上結束,殺死子程序:能夠用t.setDaemon(True)函數
def fuction(i): print("我是第%s個進程,開始時間是%s"%(i+1,time.ctime())) time.sleep((i+0.5)*2) #模擬子程序運行隨機秒 print("我是第%s個進程,結束時間是%s"%(i+1,time.ctime())) threads=[threading.Thread(target=fuction,args=(i,) ) for i in range(5)] for t in threads: t.setDaemon(True) t.start() print("主進程:%s:"%(time.ctime())) #輸出--------------------------------- 我是第1個進程,開始時間是Sun Oct 22 19:04:06 2017 我是第2個進程,開始時間是Sun Oct 22 19:04:06 2017 我是第3個進程,開始時間是Sun Oct 22 19:04:06 2017 我是第4個進程,開始時間是Sun Oct 22 19:04:06 2017 我是第5個進程,開始時間是Sun Oct 22 19:04:06 2017 主進程:Sun Oct 22 19:04:06 2017: #能夠看到主線程完成後,後面就沒有子線程了。
一種特殊狀況請注意:當並不是像上面每一個子進程同樣都設置t.setDaemon(True)(有的設置有的沒有。。)
如:學習
threads[2].setDaemon(True) #只設置了第3個和第5個,1,2,4沒有設置這隻會kill掉第5個子線程 #我的猜想,當程序運行完主線程後則會檢查剩餘的子線程,將最後面的 threads[4].setDaemon(True) #且是setDaemon(True) 子進程刪掉。第3個沒有kill掉是由於4線程還在運行 for t in threads: #而且4是默認狀態不能被kill的。這時主進程依然在等待4完成而不會 t.start() #殺掉剩餘進程,當4完成了,就不等待了直接殺掉剩餘進程
咱們能夠這樣驗證,在線程4結束前看看線程5是否存活:線程
import tensorflow as tf import numpy as np import random import threading import time def fuction(i): print("我是第%s個進程,開始時間是%s"%(i+1,time.ctime())) time.sleep((i+0.5)*2) #模擬子程序運行隨機秒 print("我是第%s個進程,結束時間是%s"%(i+1,time.ctime())) if i ==3: print("我是第4個進程:結束前進程5的狀態是:" ,threads[4].is_alive()) #加這一句判斷現成物 #的存活狀況 threads=[threading.Thread(target=fuction,args=(i,) ) for i in range(5)] #threads[0].setDaemon(True) #threads[1].setDaemon(True) threads[2].setDaemon(True) #threads[3].setDaemon(True) threads[4].setDaemon(True) for t in threads: t.start() print("主進程:%s:"%(time.ctime())) #輸出---------------------------------- 我是第1個進程,開始時間是Sun Oct 22 19:22:36 2017 我是第2個進程,開始時間是Sun Oct 22 19:22:36 2017 我是第3個進程,開始時間是Sun Oct 22 19:22:36 2017 我是第4個進程,開始時間是Sun Oct 22 19:22:36 2017 我是第5個進程,開始時間是Sun Oct 22 19:22:36 2017 主進程:Sun Oct 22 19:22:36 2017: 我是第1個進程,結束時間是Sun Oct 22 19:22:37 2017 我是第2個進程,結束時間是Sun Oct 22 19:22:39 2017 我是第3個進程,結束時間是Sun Oct 22 19:22:41 2017 我是第4個進程,結束時間是Sun Oct 22 19:22:43 2017 我是第4個進程:結束前進程5的狀態是: True #能夠看到,此時線程5仍是存活的,但4結束後5就消失了。
最後一種應用時,咱們但願主程序等待某幾個子線程先執行完後在運行,而且殺死剩餘沒有完成的程序,能夠用setDaemon()、join() 組合的方式:
如:完整運行完第1,2,3線程,以後運行主線程,主線程完成後殺死剩餘的子線程:code
def fuction(i): print("我是第%s個進程,開始時間是%s"%(i+1,time.ctime())) time.sleep((i+0.5)*2) #模擬子程序運行隨機秒 print("我是第%s個進程,結束時間是%s"%(i+1,time.ctime())) if i ==3: print("我是第4個進程:結束前進程5的狀態是:" ,threads[4].is_alive()) threads=[threading.Thread(target=fuction,args=(i,) ) for i in range(5)] #threads[0].setDaemon(True) #threads[1].setDaemon(True) #threads[2].setDaemon(True) threads[3].setDaemon(True) #設置第4和5子線程爲能夠kill的線程 threads[4].setDaemon(True) for t in threads: t.start() threads[0].join() #設置第1,2,3線程阻塞主線程的子線程 threads[1].join() threads[2].join() print("主進程:%s:"%(time.ctime())) #輸出-------------------------- 我是第1個進程,開始時間是Sun Oct 22 19:32:24 2017 我是第2個進程,開始時間是Sun Oct 22 19:32:24 2017 我是第3個進程,開始時間是Sun Oct 22 19:32:24 2017 我是第4個進程,開始時間是Sun Oct 22 19:32:24 2017 我是第5個進程,開始時間是Sun Oct 22 19:32:24 2017 我是第1個進程,結束時間是Sun Oct 22 19:32:25 2017 我是第2個進程,結束時間是Sun Oct 22 19:32:27 2017 我是第3個進程,結束時間是Sun Oct 22 19:32:29 2017 主進程:Sun Oct 22 19:32:29 2017: #咱們能夠看到只完成了第1,2,3線程,而後最後是主線程
這篇文章就到這裏,python中子線程的暫停,阻塞,關閉,和喚醒,本人都不是很明確,若有好方法但願你們一塊兒交流。我先寫在這裏。對於tensorflow中的讀取數據線程控制,等我整理在下一篇博客。htm