python多線程實現

本人初學者開始第一篇博客,記錄學習的點點滴滴,以做爲備忘錄,也但願能同你們一塊兒分享。有理解錯誤的地方但願你們指正。 python中的多線程我參考了(http://www.cnblogs.com/fnng/p...)中的介紹,介紹的很入門很詳細。介紹了threading的基本用法。

最簡單的狀況是: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

相關文章
相關標籤/搜索