一、引子
顧名思義,進程即正在執(zhí)行的一個過程。進程是對正在運行程序的一個抽象。
進程的概念起源于操作系統(tǒng),是操作系統(tǒng)最核心的概念,也是操作系統(tǒng)提供的最古老也是最重要的抽象概念之一。操作系統(tǒng)的其他所有內(nèi)容都是圍繞進程的概念展開的。
所以想要真正了解進程,必須事先了解操作系統(tǒng)
二、總結(jié)
即使可以利用的cpu只有一個(早期的計算機確實如此),也能保證支持(偽)并發(fā)的能力。將一個單獨的cpu變成多個虛擬的cpu(多道技術:時間多路復用和空間多路復用+硬件上支持隔離),沒有進程的抽象,現(xiàn)代計算機將不復存在。
一,什么是線程
在傳統(tǒng)操作系統(tǒng)中,每個進程有一個地址空間,而且默認就有一個控制線程
線程顧名思義,就是一條流水線工作的過程(流水線的工作需要電源,電源就相當于cpu),而一條流水線必須屬于一個車間,一個車間的工作過程是一個進程,車間負責把資源整合到一起,是一個資源單位,而一個車間內(nèi)至少有一條流水線。
所以,進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是cpu上的執(zhí)行單位。
多線程(即多個控制線程)的概念是,在一個進程中存在多個線程,多個線程共享該進程的地址空間,相當于一個車間內(nèi)有多條流水線,都共用一個車間的資源。例如,北京地鐵與上海地鐵是不同的進程,而北京地鐵里的13號線是一個線程,北京地鐵所有的線路共享北京地鐵所有的資源,比如所有的乘客可以被所有線路拉。
二,線程和進程的區(qū)別
Threads share the address space of the process that created it; processes have their own address space.
Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent process.
Threads can directly communicate with other threads of its process; processes must use interprocess communication to communicate with sibling processes.
New threads are easily created; new processes require duplication of the parent process.
Threads can exercise considerable control over threads of the same process; processes can only exercise control over child processes.
Changes to the main thread (cancellation, priority change, etc.) may affect the behavior of the other threads of the process; changes to the parent process does not affect child processes.
1,線程共享創(chuàng)建它的進程的地址空間;進程有自己的地址空間。
2,線程可以直接訪問其進程的數(shù)據(jù)段;進程有自己的父進程數(shù)據(jù)段的副本。
3,線程可以直接與進程的其他線程通信;進程必須使用進程間通信來與同胞進程通信。
4,新線程很容易創(chuàng)建;新進程需要父進程的重復。
5,線程可以對相同進程的線程進行相當大的控制;進程只能對子進程進行控制。
6,對主線程的更改(取消、優(yōu)先級更改等)可能會影響進程的其他線程的行為;對父進程的更改不會影響子進程。
總結(jié)上述區(qū)別,無非兩個關鍵點,這也是我們在特定的場景下需要使用多線程的原因:
1.同一個進程內(nèi)的多個線程共享該進程內(nèi)的地址資源
2.創(chuàng)建線程的開銷要遠小于創(chuàng)建進程的開銷(創(chuàng)建一個進程,就是創(chuàng)建一個車間,涉及到申請空間,而且在該空間內(nèi)建至少一條流水線,但創(chuàng)建線程,就只是在一個車間內(nèi)造一條流水線,無需申請空間,所以創(chuàng)建開銷?。?/p>
三,多線程應用舉例
開啟一個字處理軟件進程,該進程肯定需要辦不止一件事情,比如監(jiān)聽鍵盤輸入,處理文字,定時自動將文字保存到硬盤,這三個任務操作的都是同一塊數(shù)據(jù),因而不能用多進程。只能在一個進程里并發(fā)地開啟三個線程,如果是單線程,那就只能是,鍵盤輸入時,不能處理文字和自動保存,自動保存時又不能輸入和處理文字。

?四,threading模塊介紹
multiprocess模塊的完全模仿了threading模塊的接口,二者在使用層面,有很大的相似性,因而不再詳細介紹
五,開啟線程的兩種方式
方式一:
import?time
import?random
from?threading?import?Thread
def?study(name):
????print("%s is learning"%name)
????time.sleep(random.randint(1,3))
????print("%s is playing"?%?name)
if?__name__?==?'__main__':
????t?=?Thread(target=study,args=('james',))
????t.start()
????print("主線程開始運行....")
結(jié)果:
james?is?learning
主線程開始運行....
james?is?playing
方式二:
from?threading?import?Thread
import?time
class?MyThread(Thread):
????def?__init__(self,name):
????????super().__init__()
????????self.name?=?name
????def?run(self):
????????print('%s is learning'?%?self.name)
????????time.sleep(2)
????????print('%s is playing'%self.name)
if?__name__?==?'__main__':
????t1?=?MyThread('james')
????t1.start()
????print("主線程開始運行....")