Thread 多線程
#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 多線程