天天看點

Python子產品簡介之threading子產品

1、程序與線程

程式包括程序,程序包括線程。

一個程式,至少包括一個程序,因為程序是一個執行特定的功能、具有自己獨立的記憶體資源空間、系統進行資源排程和配置設定的獨立機關。這樣來說吧,可以把你的程式.py看做一個程序,符合以上的條件,對不對?但是,也可以這樣來看,把你的程式.py看成幾個程序的集合,或許這些程序之間互相獨立,互不幹擾,又或許某些程序結束後,另一些程序才能開始,就像某些函數,一個函數必須依賴另一個函數才能執行,那麼這兩個函數就可以看做兩個程序啊。

一個程序,至少包括一個線程。線程的出現是為了做到計算機的并發處理,一個程序可以包括多個線程,多個線程之間共享同一個程序的記憶體資源,比如:一個程式F為一個程序,F中有讀檔案函數R1~R5和寫檔案函W1~W5,那麼Ri和Wi便可以當做多個線程,比如現在要複制一個檔案夾fileA的5個檔案file1~file5内容到檔案夾fileB中,一般的做法是先複制檔案file1,然後file2……,所需時間為複制5個檔案的時間和;其實我們把Wi和Ri當做線程之後,這5個檔案的複制便可以同步進行,所需時間為最大檔案的複制時間。

2、threading子產品

截圖如下:

Python子產品簡介之threading子產品

這裡我們介紹類Thread的用法和如何開啟線程和關閉線程:

Thread類有以下幾個方法:

start()#開啟線程的執行

run()#定義線程的功能函數,一旦線程被開啟,功能函數自動開始執行,一般會被子類改寫

join(timout=None)#程式挂起,就是在join()函數後等待線程的執行結束才執行join()函數以後的程式的内容,如果給定了timeout(不為None),則程式最多挂起時間為timeout,否則一直等到所有線程結束。

getName()#傳回線程的名字

setName(name)#設定線程的名字

isAlive()#線程正在運作傳回True,否則傳回False

isDaemon()#傳回線程的Daemon标志

setDaemon(daemon)#設定線程的Daemon标志為daemon,一定要在start()函數執行前執行

找段程式介紹一下它們的用法:(程式如下)

1 #!/usr/bin/env python   '''這一句是告訴系統Python解釋器在這個位置'''

3 import threading  '''這一句是導入了子產品threading,一般為了下邊使用友善,寫成:from threading import *  表示導入子產品threading中的所有方法或者變量或者對象。 '''

4 from time import sleep, ctime  '''這一句是導入了子產品time中的sleep()和ctime()兩個函數'''

6 loops = [4,2]  '''指定睡眠時間清單,供函數使用'''

8 def loop(nloop, nsec):  '''定義睡眠函數(循環函數)'''

9 print 'start loop', nloop, 'at:', ctime()  '''ctime()函數傳回目前的時間,精确到秒,此為開始時間'''

10 sleep(nsec)  '''執行睡眠函數'''

11 print 'loop', nloop, 'done at:', ctime() '''此為結束時間'''

12 

13 def main(): '''定義main函數'''

14 print 'starting at:', ctime() 

15 threads = [] '''建立線程清單'''

16 nloops = range(len(loops)) 

17 

18 for i in nloops:  '''循環建立線程,并且加入線程表threads中去'''

19 t = threading.Thread(target=loop, args=(i, loops[i])) '''這是執行個體化一個threading.Thread類的對象作為一個線程,傳入參數‘target=函數的名字’,args為一個參數清單或元組,其中元素為函數所需要的參數,args=(函數參數)'''

20

21 threads.append(t) '''将執行個體加入threads中'''

22 

23 for i in nloops: # start threads 

24 threads[i].start()  '''循環啟動各個對象的stat(),雖然是一個一個啟動,但是在執行的時候是并發的同時的'''

25 

26 for i in nloops: # wait for all 

27 threads[i].join()  '''等待線程結束'''

28 

29 print 'all DONE at:', ctime() '''列印結束時間'''

30 

31 if __name__ == '__main__':  '''這一句告訴解釋器,執行的時候從main()開始

32 main()