1、程序與線程
程式包括程序,程序包括線程。
一個程式,至少包括一個程序,因為程序是一個執行特定的功能、具有自己獨立的記憶體資源空間、系統進行資源排程和配置設定的獨立機關。這樣來說吧,可以把你的程式.py看做一個程序,符合以上的條件,對不對?但是,也可以這樣來看,把你的程式.py看成幾個程序的集合,或許這些程序之間互相獨立,互不幹擾,又或許某些程序結束後,另一些程序才能開始,就像某些函數,一個函數必須依賴另一個函數才能執行,那麼這兩個函數就可以看做兩個程序啊。
一個程序,至少包括一個線程。線程的出現是為了做到計算機的并發處理,一個程序可以包括多個線程,多個線程之間共享同一個程序的記憶體資源,比如:一個程式F為一個程序,F中有讀檔案函數R1~R5和寫檔案函W1~W5,那麼Ri和Wi便可以當做多個線程,比如現在要複制一個檔案夾fileA的5個檔案file1~file5内容到檔案夾fileB中,一般的做法是先複制檔案file1,然後file2……,所需時間為複制5個檔案的時間和;其實我們把Wi和Ri當做線程之後,這5個檔案的複制便可以同步進行,所需時間為最大檔案的複制時間。
2、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解釋器在這個位置'''
2
3 import threading '''這一句是導入了子產品threading,一般為了下邊使用友善,寫成:from threading import * 表示導入子產品threading中的所有方法或者變量或者對象。 '''
4 from time import sleep, ctime '''這一句是導入了子產品time中的sleep()和ctime()兩個函數'''
5
6 loops = [4,2] '''指定睡眠時間清單,供函數使用'''
7
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()