1. 程式人生 > >Thread 多線程

Thread 多線程

遍歷數組 模塊 all 直接 使用 多線程 start list 出了

#coding=utf-8
import threading
from time import ctime,sleep


def music(func):
for i in range(2):
print "I was listening to %s. %s" %(func,ctime())
sleep(1)

def move(func):
for i in range(2):
print "I was at the %s! %s" %(func,ctime())
sleep(5)

threads = []
t1 = threading.Thread(target=music,args=(u‘愛情買賣‘,))
threads.append(t1)
t2 = threading.Thread(target=move,args=(u‘阿凡達‘,))
threads.append(t2)

if __name__ == ‘__main__‘:
for t in threads:
t.setDaemon(True)
t.start()

print "all over %s" %ctime()


import threading

首先導入threading 模塊,這是使用多線程的前提。

threads = []

t1 = threading.Thread(target=music,args=(u‘愛情買賣‘,))

threads.append(t1)

  創建了threads數組,創建線程t1,使用threading.Thread()方法,在這個方法中調用music方法target=music,args方法對music進行傳參。 把創建好的線程t1裝到threads數組中。

  接著以同樣的方式創建線程t2,並把t2也裝到threads數組。

for t in threads:

  t.setDaemon(True)

  t.start()

最後通過for循環遍歷數組。(數組被裝載了t1和t2兩個線程)

setDaemon()

  setDaemon(True)將線程聲明為守護線程,必須在start() 方法調用之前設置,如果不設置為守護線程程序會被無限掛起。子線程啟動後,父線程也繼續執行下去,當父線程執行完最後一條語句print "all over %s" %ctime()後,沒有等待子線程,直接就退出了,同時子線程也一同結束。

start()

開始線程活動。

>>> ========================= RESTART ================================
>>> 
I was listening to 愛情買賣. Thu Apr 17 12:51:45 2014 I was at the 阿凡達! Thu Apr 17 12:51:45 2014  all over Thu Apr 17 12:51:45 2014

從執行結果來看,子線程(muisc 、move )和主線程(print "all over %s" %ctime())都是同一時間啟動,但由於主線程執行完結束,所以導致子線程也終止。

...
if __name__ == ‘__main__‘:
    for t in threads:
        t.setDaemon(True)
        t.start()
    
    t.join()

    print "all over %s" %ctime()

我們只對上面的程序加了個join()方法,用於等待線程終止。join()的作用是,在子線程完成運行之前,這個子線程的父線程將一直被阻塞。

  註意: join()方法的位置是在for循環外的,也就是說必須等待for循環裏的兩個進程都結束後,才去執行主進程。

>>> ========================= RESTART ================================
>>> 
I was listening to 愛情買賣. Thu Apr 17 13:04:11 2014  I was at the 阿凡達! Thu Apr 17 13:04:11 2014

I was listening to 愛情買賣. Thu Apr 17 13:04:12 2014
I was at the 阿凡達! Thu Apr 17 13:04:16 2014
all over Thu Apr 17 13:04:21 2014

從執行結果可看到,music 和move 是同時啟動的。

  開始時間4分11秒,直到調用主進程為4分22秒,總耗時為10秒。

Thread 多線程