python中的網絡編程和多進程(四)

線程是操作系統可以調度的最小執行單位, 夠執行併發處理。通常是將程序分為2個或多個併發運行 線程,即同時執行多個操作。例如,使用線程同時監視用戶併發輸入,並執行後臺任務等。

1、 進程和線程

進程是操作系統中正在執行的應用程序的一個實例,操作系統吧不同的進程(不同的程序)分離出來。每一個進程都有自己的地址空間,一般情況下,包括文本區域、數據區域和隊棧。文本區域存儲處理器執行的代碼,數據區域存儲變量和進程執行期間使用的動態分配的內存;隊棧區域存儲著活動過程調用的指令和本地變量。

每個進程至少包括一個線程,它從程序開始執行,直到退出程序,主線程結束,該進程也被從內存中卸載。主線程在運行過程中還可以創建新的線程,實習多線程的功能。

線程就是一段順序程序。但是線程不能獨立運行,只能在程序中運行。

不同的操作系統實現進程和線程的方法是不同的,但不多數是在進程中包含線程,windows就是這樣。一個進程中可以存在多個進程,線程可以共享進程的資源(比如內存)。而不同的進程之間則是不能共享資源的。

2、 多線程的優點

多線程類似於同時執行多個不同程序,多線程運行有如下優點:

A、 使用線程可以把佔據長時間的程序中的任務放到後臺去處理

B、 用戶界面可以更加吸引人,這樣比如用戶單擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進程

C、 程序的運行速度可能加快

D、 在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種的情況下可以釋放一些珍貴的資源如內存佔用等。

線程在執行過程中與進程還是有區別的。 每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制

每個線程都有他自己的一組CPU寄存器,稱為線程的上下文,該上下文反映了線程上次運行該線程的CPU寄存器的狀態


3 、線程的狀態

在操作系統內核中,線程可以被標記成如下狀態

A、 初始化:在創建線程,操作系統在內部會將其標識為初始化狀態。此狀態只在系統內核中使用

B、 就緒:線程已經準備好被執行

C、 延遲就緒:表示線程已經被選擇在指定的處理器上運行,但還沒有被調度

D、 備用:表示線程已經被選擇下一個在指定的處理器上運行。當該處理器上運行的線程因等待資源等原因被掛起時,調度器將備用線程切換到處理器上運行,只有一個線程可以是備用狀態

E、 運行:表示調度器將線程切換到處理器上運行,它可以運行一個線程週期,只有一個線程可以是備用狀態

F、 等待:線程可以因為等待一個同步執行的對象或等待資源等原因從內存中移除。一旦其內核堆被加載到內存中,線程就會變成運行狀態

G、 過渡:表示線程已經準備好被執行,但它的內核堆已經被從內存中移除。一旦其內核堆被加載到內存中,線程就會編程運行狀態

H、 終止:當線程執行完成後,其狀態會變成終止。系統會釋放線程中的數據結構和資源。


4、 創建線程

Python中使用線程有二種方式:函數或者用類來創建線程對象

4.1 start_new_thread()函數創建線程

調用_thread模板中的start_new_thread()函數來產生新線程。格式如下:

_thread.start_new_thread(function, args[,kwargs])

參數說明如下:

python中的網絡編程和多進程(四)

start_new_thread()創建一個線程並運行指定函數,當函數返回時,線程自動結束。也就可以在線程函數中調用_thread.exit(),它拋出SystemExit exception,達到退出線程的目的

python中的網絡編程和多進程(四)


執行以上程序輸出結果如下


python中的網絡編程和多進程(四)

Python通過兩個標準模板_thread模板和threading提供對線程的支持。_thread提供低級別的、原始的線程已經一個簡單的鎖

4.2 Thread類創建線程

threading 線程模板封裝了_thread模板,並提供更多功能,雖然可以使_thread模板中start_new_thread()函數創建線程,但一般建議使用threading模板

threading 模板提供了Thread類來創建和處理線程,格式如下:

線程對象 = threading.Thread(target = 線程函數, args=(參數列表), name=線程名, group=線程組)

線程名和線程組都可以省略。

創建線程後,通常需要調用線程對象的setdaemon()方法將線程設置為守護線程。主線程執行完後,如果還有其他守護線程,則主線程不會退出,會被無限掛起;必須將線程聲明為守護線程之後,如果隊列中的線程運行完了,那麼整個程序不用等待就可以退出。

setDaemon()函數的使用方法如下:

線程對象.setDaemon(是否設置為守護線程)

setDaemon()函數必須在運行線程之前被調用。調用線程對象的start()方法可以運行線程

下面是Thread類提供的常用方法

python中的網絡編程和多進程(四)

下面是threading模板提供的其他方法

python中的網絡編程和多進程(四)

例如:編寫自己的線程類myThread來創建對象

python中的網絡編程和多進程(四)

以上程序的執行結果如下:

python中的網絡編程和多進程(四)


分享到:


相關文章: