Python多線程與多進(jìn)程

概念理解

對于操作系統(tǒng)來說晌砾,一個任務(wù)就是一個進(jìn)程。例如打開瀏覽器烦磁,打開word养匈,打開記事本等等,都是獨立的任務(wù)都伪,它們各自為一個或者多個進(jìn)程呕乎。這里要注意的是,同一種任務(wù)打開多個陨晶,分別屬于不同進(jìn)程猬仁,例如chrome打開多個標(biāo)簽,實際上它創(chuàng)建了多個進(jìn)程先誉。對于一個任務(wù)來說湿刽,它有很多子任務(wù),例如播放器褐耳,既要解碼視頻诈闺、也要解碼音頻,所以在進(jìn)程下存在多線程铃芦。在一個進(jìn)程下一定存在一個線程雅镊,可以稱它為主線程。操作系統(tǒng)創(chuàng)建進(jìn)程時刃滓,會單獨為每一個進(jìn)程分配各自的資源仁烹,進(jìn)程與進(jìn)程之間相互隔離。而進(jìn)程內(nèi)的線程咧虎,則共享了當(dāng)前進(jìn)程內(nèi)的資源晃危。可見,操作系統(tǒng)執(zhí)行的粒度是線程僚饭,分配資源的粒度是進(jìn)程震叮,我們的多任務(wù)操作系統(tǒng),在單核CPU上是在各個線程上不斷切換而達(dá)到目的鳍鸵,而在多核CPU上則能同時執(zhí)行多個線程任務(wù)苇瓣。Python能很方便地支持多進(jìn)程、多線程編程偿乖,接下來就簡單記錄下击罪,最后再記錄下兩者優(yōu)缺點。

多進(jìn)程

在Linux系統(tǒng)下贪薪,有一個非常特殊的函數(shù)媳禁,fork()。它調(diào)用一次画切,返回兩次竣稽,操作系統(tǒng)自動把當(dāng)前進(jìn)程(父進(jìn)程)復(fù)制了一份(子進(jìn)程),然后分別在父進(jìn)程和子進(jìn)程內(nèi)返回霍弹。子進(jìn)程永遠(yuǎn)返回0毫别,父進(jìn)程返回子進(jìn)程的ID。經(jīng)過這樣做典格,父進(jìn)程就能fork出很多子進(jìn)程岛宦,并可以記錄下子進(jìn)程的ID號了,子進(jìn)程可以通過getppid()來獲取父進(jìn)程ID耍缴。fork()僅在Unix/Linux下使用砾肺,windows則不行。所以防嗡,在Python中债沮,存在一個跨平臺的包mutiprocessing,通過引入包中的Process類本鸣,就可以創(chuàng)建多進(jìn)程程序了疫衩,可以創(chuàng)建一個進(jìn)程p=Process(target=func,args=(*,)),然后利用p.start()及p.join()來執(zhí)行了荣德。以上的join()方法可以等待子進(jìn)程結(jié)束后才往下執(zhí)行闷煤,通常用于進(jìn)程間同步。另外涮瞻,可以用進(jìn)程池的方式鲤拿,例如p=Pool(n),然后p.apply_async(func,args)署咽,這里可以使用n種不同的參數(shù)傳入近顷,建立不同的進(jìn)程生音。用這種方式時,在調(diào)用join()方法前窒升,要先調(diào)用close()方法缀遍,使得不能再添加新進(jìn)程。mutiprocessing包里提供了Queue饱须、Pipe等多種進(jìn)程間通信的方法域醇。可以直接引入Queue類蓉媳,然后實例化一個對象譬挚。則不同的進(jìn)程可以使用put方法發(fā)信息,同時可以使用get方法取信息酪呻。

多線程

多個任務(wù)可以創(chuàng)建多個進(jìn)程來完成减宣,同時也可以創(chuàng)建多個線程來完成,線程是操作系統(tǒng)直接的執(zhí)行單元玩荠。Python含有threading這個高級模塊漆腌,要啟動一個線程,就是把一個函數(shù)傳出并創(chuàng)建Thread實例姨蟋,然后調(diào)用start()方法開始執(zhí)行,例如t=threading.Thread(target=func,name=*)立帖,注意這里的name屬性眼溶,它是給線程命名的,缺省值為Thread-1···晓勇。要注意的是堂飞,剛才說了,任何一個進(jìn)程都含有一個線程绑咱,而這個主線程則執(zhí)行著我們編寫的程序绰筛,可以調(diào)用threading.current_thread().name來查看它,它的名字就叫MainThread描融。在多線程編程中铝噩,有一個最大的問題就在于進(jìn)程內(nèi)的資源被各個線程所共享,進(jìn)程內(nèi)任何變量都可以被任何一個線程修改窿克,因此骏庸,線程之間若去修改同一個變量,則可能導(dǎo)致程序Bug年叮。所以具被,引入了鎖機制。當(dāng)某個線程去修改某個變量時只损,可以在變量所在的方法內(nèi)加一把鎖一姿,使得其他線程不能同時執(zhí)行該方法,只有釋放了鎖后,其他線程才能去獲得鎖并獲得修改權(quán)叮叹。創(chuàng)建一個鎖是通過lock=threading.Lock()來實現(xiàn)的艾栋,可以使用try···finally···語句,在try之前使用lock.acquire()獲得鎖衬横,然后在try語句里面修改變量裹粤,然后在finally語句里加lock.release()來保證鎖一定被釋放,避免成為一個死鎖蜂林。

區(qū)別于聯(lián)系

多進(jìn)程的優(yōu)點是穩(wěn)定性好遥诉,一個子進(jìn)程崩潰了,不會影響主進(jìn)程以及其余進(jìn)程噪叙。但是缺點是創(chuàng)建進(jìn)程的代價非常大矮锈,因為操作系統(tǒng)要給每個進(jìn)程分配固定的資源,并且睁蕾,操作系統(tǒng)對進(jìn)程的總數(shù)會有一定的限制苞笨,若進(jìn)程過多,操作系統(tǒng)調(diào)度都會存在問題子眶,會造成假死狀態(tài)瀑凝。多線程優(yōu)點是效率較高一些,但是致命的缺點是任何一個線程崩潰都可能造成整個進(jìn)程的崩潰臭杰,因為它們共享了進(jìn)程的內(nèi)存資源池粤咪。對于任務(wù)數(shù)來說,無論是多進(jìn)程或者多線程渴杆,都不能太多寥枝。因為操作系統(tǒng)在切換任務(wù)時,會有一系列的保護(hù)現(xiàn)場措施磁奖,這要花費相當(dāng)?shù)南到y(tǒng)資源囊拜,若任務(wù)過多,則大部分資源都被用做干這些了比搭,結(jié)果就是所有任務(wù)都做不好冠跷,所以操作系統(tǒng)會限制進(jìn)程的數(shù)量。另外身诺,考慮計算密集型及IO密集型應(yīng)用程序蔽莱。對于計算密集型,多任務(wù)勢必造成資源浪費戚长。對于IO密集型盗冷,因為IO速度遠(yuǎn)低于CPU計算速度,所以使用多任務(wù)方式可以大大增大程序運行效率同廉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仪糖,一起剝皮案震驚了整個濱河市柑司,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锅劝,老刑警劉巖攒驰,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異故爵,居然都是意外死亡玻粪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門诬垂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲室,“玉大人,你說我怎么就攤上這事结窘『苎螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵隧枫,是天一觀的道長喉磁。 經(jīng)常有香客問我,道長官脓,這世上最難降的妖魔是什么协怒? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮卑笨,結(jié)果婚禮上孕暇,老公的妹妹穿的比我還像新娘。我一直安慰自己湾趾,他們只是感情好芭商,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布派草。 她就那樣靜靜地躺著搀缠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪近迁。 梳的紋絲不亂的頭發(fā)上艺普,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音鉴竭,去河邊找鬼歧譬。 笑死,一個胖子當(dāng)著我的面吹牛搏存,可吹牛的內(nèi)容都是我干的瑰步。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼璧眠,長吁一口氣:“原來是場噩夢啊……” “哼缩焦!你這毒婦竟也來了读虏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袁滥,失蹤者是張志新(化名)和其女友劉穎盖桥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體题翻,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡揩徊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嵌赠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塑荒。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猾普,靈堂內(nèi)的尸體忽然破棺而出袜炕,到底是詐尸還是另有隱情,我是刑警寧澤初家,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布偎窘,位于F島的核電站,受9級特大地震影響溜在,放射性物質(zhì)發(fā)生泄漏陌知。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一掖肋、第九天 我趴在偏房一處隱蔽的房頂上張望仆葡。 院中可真熱鬧,春花似錦志笼、人聲如沸沿盅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腰涧。三九已至,卻和暖如春紊浩,著一層夾襖步出監(jiān)牢的瞬間窖铡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工坊谁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留费彼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓口芍,卻偏偏與公主長得像箍铲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鬓椭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容