Python學(xué)習(xí)中的多進(jìn)程與多線程:新手簡介

什么是線程?你為什么想要它?

Python是一種線性語言。但是砾淌,當(dāng)您需要更多的處理能力時篱瞎,線程模塊就派上用場了。

Python中的線程不能用于并行CPU計(jì)算达罗。但是它非常適合于I/O操作坝撑,比如web抓取静秆,因?yàn)樘幚砥魈幱诳臻e狀態(tài),等待數(shù)據(jù)巡李。

線程化改變了游戲規(guī)則抚笔,因?yàn)樵S多與網(wǎng)絡(luò)/數(shù)據(jù) I/O相關(guān)的腳本將大部分時間花費(fèi)在等待來自遠(yuǎn)程數(shù)據(jù)源上。有時候侨拦,下載可能沒有鏈接(例如殊橙,如果您正在抓取不同的網(wǎng)站),處理器可以并行地從不同的數(shù)據(jù)源下載并在最后合并結(jié)果狱从。

線程包含在標(biāo)準(zhǔn)庫中:

您可以使用target作為可調(diào)用的對象膨蛮,args將參數(shù)傳遞給函數(shù),并開始啟動線程:


鎖(lock)

您通常希望您的線程能夠使用或修改線程之間的公共變量季研。要做到這一點(diǎn)敞葛,你必須使用一種叫做鎖(lock)的東西。

每當(dāng)一個函數(shù)想要修改一個變量時与涡,它就會鎖定該變量惹谐。當(dāng)另一個函數(shù)想要使用一個變量時,它必須等待驼卖,直到該變量被解鎖氨肌。

假設(shè)有兩個函數(shù)都對一個變量進(jìn)行了1次迭代。鎖允許您確保一個函數(shù)可以訪問變量酌畜、執(zhí)行計(jì)算并在另一個函數(shù)訪問相同的變量之前寫回該變量怎囚。

您可以使用打印鎖來確保一次只能打印一個線程。這可以防止文本在打印時變得混亂(并導(dǎo)致數(shù)據(jù)損壞)桥胞。

在下面的代碼中桩了,我們有10個我們想要完成的工作和5個將要工作的工人:

Python作為一門不斷發(fā)展與普及的語言,還在不斷更新中埠戳。在學(xué)習(xí)時,建議找一些學(xué)習(xí)伙伴一起來學(xué)習(xí)和討論蕉扮,效果更佳整胃。如果想學(xué)習(xí)Python,歡迎加入Python學(xué)習(xí)交流群(627012464)喳钟,一起督促屁使,一起學(xué)習(xí)。里面有開發(fā)工具奔则,很多干貨和技術(shù)資料分享蛮寂!

多線程并不總是完美的解決方案

我們發(fā)現(xiàn)許多教程都傾向于忽略使用他們剛教過你的工具的缺點(diǎn)。理解使用所有這些工具的利弊是很重要的易茬。

例如:

1.管理線程需要時間酬蹋,因此它適用于基本任務(wù)(如示例)

2.線程化增加了程序的復(fù)雜性及老,從而增加了調(diào)試的難度

多進(jìn)程是什么?它與線程有什么不同?

在沒有多進(jìn)程(multiprocessing)的情況下,由于GIL(全局解釋器鎖 Global Interpreter Lock)范抓,Python程序很難最大化系統(tǒng)的規(guī)格骄恶。Python的設(shè)計(jì)并沒有考慮到個人計(jì)算機(jī)可能有多個核心。因此GIL是必要的匕垫,因?yàn)镻ython不是線程安全的僧鲁,而且在訪問Python對象時存在一個全局強(qiáng)制鎖。雖然不完美象泵,但它是一種非常有效的內(nèi)存管理機(jī)制寞秃。

多進(jìn)程允許您創(chuàng)建可以并發(fā)運(yùn)行的程序(繞過GIL)并使用整個CPU內(nèi)核。盡管它與線程庫有本質(zhì)的不同偶惠,但是語法非常相似春寿。多進(jìn)程庫為每個進(jìn)程提供了自己的Python解釋器,以及各自的GIL洲鸠。

因此堂淡,與線程相關(guān)的常見問題(如數(shù)據(jù)損壞和死鎖)不再是問題。因?yàn)檫M(jìn)程不共享內(nèi)存扒腕,所以它們不能并發(fā)地修改相同的內(nèi)存绢淀。

讓我們開始代碼演示:

如果您有一個共享數(shù)據(jù)庫,您希望確保在啟動新數(shù)據(jù)庫之前瘾腰,正在等待相關(guān)進(jìn)程完成皆的。

如果希望將參數(shù)傳遞給進(jìn)程,可以使用args實(shí)現(xiàn)這一點(diǎn):

這是一個簡單的例子蹋盆,因?yàn)檎缒⒁獾降姆驯。瑪?shù)字的排列順序與您所期望的不一致(沒有p.join())。

與線程一樣栖雾,多進(jìn)程仍然有缺點(diǎn)……你必須選擇其中一個壞處:

1.在進(jìn)程之間轉(zhuǎn)移數(shù)據(jù)會帶來I/O開銷

2.整個內(nèi)存被復(fù)制到每個子進(jìn)程中楞抡,對于更重要的程序來說,這會帶來很大的開銷

我們該用哪個

如果你的代碼有很多I/O或網(wǎng)絡(luò)使用:

多線程是您的最佳選擇析藕,因?yàn)樗拈_銷很低

如果你有一個圖形用戶界面

多線程是您的最佳選擇召廷,這樣你的UI線程就不會被鎖定

如果你的代碼是CPU限制:

您應(yīng)該使用多進(jìn)程(如果您的機(jī)器有多個核心)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市账胧,隨后出現(xiàn)的幾起案子竞慢,更是在濱河造成了極大的恐慌,老刑警劉巖治泥,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筹煮,死亡現(xiàn)場離奇詭異,居然都是意外死亡居夹,警方通過查閱死者的電腦和手機(jī)败潦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門本冲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人变屁,你說我怎么就攤上這事眼俊。” “怎么了粟关?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵疮胖,是天一觀的道長。 經(jīng)常有香客問我闷板,道長澎灸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任遮晚,我火速辦了婚禮性昭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘县遣。我一直安慰自己糜颠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布萧求。 她就那樣靜靜地躺著其兴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夸政。 梳的紋絲不亂的頭發(fā)上元旬,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機(jī)與錄音守问,去河邊找鬼匀归。 笑死,一個胖子當(dāng)著我的面吹牛耗帕,可吹牛的內(nèi)容都是我干的穆端。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仿便,長吁一口氣:“原來是場噩夢啊……” “哼徙赢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起探越,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窑业,沒想到半個月后钦幔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡常柄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年鲤氢,在試婚紗的時候發(fā)現(xiàn)自己被綠了搀擂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡卷玉,死狀恐怖哨颂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情相种,我是刑警寧澤威恼,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寝并,受9級特大地震影響箫措,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衬潦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一斤蔓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镀岛,春花似錦弦牡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拨与,卻和暖如春稻据,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背买喧。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工捻悯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淤毛。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓今缚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親低淡。 傳聞我的和親對象是個殘疾皇子姓言,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355