python并發(fā)編程

一秧廉、引子

顧名思義膛壹,進(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)行....")

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末医瘫,一起剝皮案震驚了整個(gè)濱河市侣肄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醇份,老刑警劉巖稼锅,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異僚纷,居然都是意外死亡矩距,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門怖竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锥债,“玉大人,你說我怎么就攤上這事痊臭∠牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵趣兄,是天一觀的道長绽左。 經(jīng)常有香客問我,道長艇潭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任戏蔑,我火速辦了婚禮蹋凝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘总棵。我一直安慰自己鳍寂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布情龄。 她就那樣靜靜地躺著迄汛,像睡著了一般捍壤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞍爱,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天鹃觉,我揣著相機(jī)與錄音,去河邊找鬼睹逃。 笑死盗扇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沉填。 我是一名探鬼主播疗隶,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼翼闹!你這毒婦竟也來了斑鼻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤猎荠,失蹤者是張志新(化名)和其女友劉穎卵沉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體法牲,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡史汗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拒垃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片停撞。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悼瓮,靈堂內(nèi)的尸體忽然破棺而出戈毒,到底是詐尸還是另有隱情,我是刑警寧澤横堡,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布埋市,位于F島的核電站,受9級(jí)特大地震影響命贴,放射性物質(zhì)發(fā)生泄漏道宅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一胸蛛、第九天 我趴在偏房一處隱蔽的房頂上張望污茵。 院中可真熱鬧,春花似錦葬项、人聲如沸泞当。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽襟士。三九已至盗飒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陋桂,已是汗流浹背逆趣。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留章喉,地道東北人汗贫。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像秸脱,于是被迫代替她去往敵國和親落包。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348