一秧廉、引子
顧名思義膛壹,進(jìn)程即正在執(zhí)行的一個(gè)過程。進(jìn)程是對正在運(yùn)行程序的一個(gè)抽象赵刑。
進(jìn)程的概念起源于操作系統(tǒng)分衫,是操作系統(tǒng)最核心的概念,也是操作系統(tǒng)提供的最古老也是最重要的抽象概念之一般此。操作系統(tǒng)的其他所有內(nèi)容都是圍繞進(jìn)程的概念展開的蚪战。
所以想要真正了解進(jìn)程,必須事先了解操作系統(tǒng)
二铐懊、總結(jié)
即使可以利用的cpu只有一個(gè)(早期的計(jì)算機(jī)確實(shí)如此)邀桑,也能保證支持(偽)并發(fā)的能力。將一個(gè)單獨(dú)的cpu變成多個(gè)虛擬的cpu(多道技術(shù):時(shí)間多路復(fù)用和空間多路復(fù)用+硬件上支持隔離)居扒,沒有進(jìn)程的抽象概漱,現(xiàn)代計(jì)算機(jī)將不復(fù)存在丑慎。
一喜喂,什么是線程
在傳統(tǒng)操作系統(tǒng)中,每個(gè)進(jìn)程有一個(gè)地址空間竿裂,而且默認(rèn)就有一個(gè)控制線程
線程顧名思義玉吁,就是一條流水線工作的過程(流水線的工作需要電源,電源就相當(dāng)于cpu)腻异,而一條流水線必須屬于一個(gè)車間进副,一個(gè)車間的工作過程是一個(gè)進(jìn)程,車間負(fù)責(zé)把資源整合到一起悔常,是一個(gè)資源單位影斑,而一個(gè)車間內(nèi)至少有一條流水線。
所以机打,進(jìn)程只是用來把資源集中到一起(進(jìn)程只是一個(gè)資源單位矫户,或者說資源集合),而線程才是cpu上的執(zhí)行單位残邀。
多線程(即多個(gè)控制線程)的概念是皆辽,在一個(gè)進(jìn)程中存在多個(gè)線程柑蛇,多個(gè)線程共享該進(jìn)程的地址空間,相當(dāng)于一個(gè)車間內(nèi)有多條流水線驱闷,都共用一個(gè)車間的資源耻台。例如,北京地鐵與上海地鐵是不同的進(jìn)程空另,而北京地鐵里的13號(hào)線是一個(gè)線程盆耽,北京地鐵所有的線路共享北京地鐵所有的資源,比如所有的乘客可以被所有線路拉扼菠。
二征字,線程和進(jìn)程的區(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)建它的進(jìn)程的地址空間;進(jìn)程有自己的地址空間娇豫。
2匙姜,線程可以直接訪問其進(jìn)程的數(shù)據(jù)段;進(jìn)程有自己的父進(jìn)程數(shù)據(jù)段的副本。
3冯痢,線程可以直接與進(jìn)程的其他線程通信;進(jìn)程必須使用進(jìn)程間通信來與同胞進(jìn)程通信氮昧。
4,新線程很容易創(chuàng)建;新進(jìn)程需要父進(jìn)程的重復(fù)浦楣。
5袖肥,線程可以對相同進(jìn)程的線程進(jìn)行相當(dāng)大的控制;進(jìn)程只能對子進(jìn)程進(jìn)行控制。
6振劳,對主線程的更改(取消椎组、優(yōu)先級(jí)更改等)可能會(huì)影響進(jìn)程的其他線程的行為;對父進(jìn)程的更改不會(huì)影響子進(jìn)程。
總結(jié)上述區(qū)別历恐,無非兩個(gè)關(guān)鍵點(diǎn)寸癌,這也是我們在特定的場景下需要使用多線程的原因:
1.同一個(gè)進(jìn)程內(nèi)的多個(gè)線程共享該進(jìn)程內(nèi)的地址資源
2.創(chuàng)建線程的開銷要遠(yuǎn)小于創(chuàng)建進(jìn)程的開銷(創(chuàng)建一個(gè)進(jìn)程,就是創(chuàng)建一個(gè)車間弱贼,涉及到申請空間蒸苇,而且在該空間內(nèi)建至少一條流水線,但創(chuàng)建線程吮旅,就只是在一個(gè)車間內(nèi)造一條流水線溪烤,無需申請空間,所以創(chuàng)建開銷斜硬)
三檬嘀,多線程應(yīng)用舉例
開啟一個(gè)字處理軟件進(jìn)程,該進(jìn)程肯定需要辦不止一件事情责嚷,比如監(jiān)聽鍵盤輸入鸳兽,處理文字,定時(shí)自動(dòng)將文字保存到硬盤再层,這三個(gè)任務(wù)操作的都是同一塊數(shù)據(jù)贸铜,因而不能用多進(jìn)程堡纬。只能在一個(gè)進(jìn)程里并發(fā)地開啟三個(gè)線程,如果是單線程,那就只能是蒿秦,鍵盤輸入時(shí)烤镐,不能處理文字和自動(dòng)保存,自動(dòng)保存時(shí)又不能輸入和處理文字棍鳖。
?四炮叶,threading模塊介紹
multiprocess模塊的完全模仿了threading模塊的接口,二者在使用層面渡处,有很大的相似性镜悉,因而不再詳細(xì)介紹
五,開啟線程的兩種方式
方式一:
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("主線程開始運(yùn)行....")
結(jié)果:
james?is?learning
主線程開始運(yùn)行....
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("主線程開始運(yùn)行....")