python多線程中join的用法

python中多線程join是用來阻塞主線程的。 


看下面的例子:

def fast():
    print "in fast"
    sleep(10)
    print "done in fast"


def slow():
    print "in slow"
    sleep(15)
    print "done in slow"

一個運行快,一個運行慢


def main():

    start=datetime.datetime.now()
    threads = []
    f = [fast, slow]
    l = len(f)
    for i in range(l):
        
        t=threading.Thread(target=f[i],args=())
        threads.append(t)

    for i in range(l):
        threads[i].start()

    for i in range(l):
        
        threads[i].join()
        print threads[i].getName()

    end=datetime.datetime.now()
    print end-start
    print "Done on main"
    exit()



請問上面的函數輸出的是什麼? 朋友們可以先想一下,如果對了,說明你掌握了join的用法了。









正確的輸出是:


in fast
in slow
done in fast
Thread-1
done in slow
Thread-2
0:00:15.001000
Done on main

如果沒有join的那一段,那麼 Done on main 將會在in slow後面就執行。


而答應線程名字那條語句,則是需要等到第一個線程的join結束後才能夠輸出。 



那麼如果把上面fast和slow的時間改一下,改成:

def fast():
    print "in fast"
    sleep(15)
    print "done in fast"


def slow():
    print "in slow"
    sleep(10)
    print "done in slow"


那麼這次輸出的有是什麼呢?


in fast
in slow
done in slow
done in fast
Thread-1
Thread-2
0:00:15.001000
Done on main


因爲在多線程開始之後,2個線程都同時執行,而在第一個線程運行join的時候,現在程序在等到第一個線程結束才能執行打印線程名字。

而本身後臺同時運行着2個線程,join並沒有把線程2停止了。所以在線程1還在運行的時候(需要15s),而第二個線程 已經完成的輸出結果,因爲第二個線程運行時間只有10s。 所以也就是線程1join結束後,打印出線程1的名字, 這會線程2的名字馬上就會被打印出來,並沒有等待10s的時間。




http://30daydo.com/

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