day38-并發(fā)編程之多線程

一、線程

線程顧名思義冬三,就是一條流水線工作的過程,一條流水線必須屬于一個(gè)車間缘缚,一個(gè)車間的工作過程是一個(gè)進(jìn)程

車間負(fù)責(zé)把資源整合到一起勾笆,是一個(gè)資源單位,而一個(gè)車間內(nèi)至少有一個(gè)流水線

流水線的工作需要電源桥滨,電源就相當(dāng)于cpu

所以窝爪,進(jìn)程只是用來把資源集中到一起(進(jìn)程只是一個(gè)資源單位弛车,或者說資源集合),而線程才是cpu上的執(zhí)行單位蒲每。

多線程(即多個(gè)控制線程)的概念是纷跛,在一個(gè)進(jìn)程中存在多個(gè)控制線程,多個(gè)控制線程共享該進(jìn)程的地址空間邀杏,相當(dāng)于一個(gè)車間內(nèi)有多條流水線贫奠,都共用一個(gè)車間的資源。

進(jìn)程是資源分配的最小單位望蜡,線程是CPU調(diào)度的最小單位唤崭。每一個(gè)進(jìn)程中至少有一個(gè)線程。

二脖律、開啟線程的兩種方式

method 1 :

from threading import Thread
import time


def task(n):
    print(f"線程{n}開始")
    time.sleep(2)
    print(f"線程{n}結(jié)束")


if __name__ == '__main__':
    t = Thread(target=task,args=(1,))
    t.start()
    t2 = Thread(target=task, args=(2,))
    t2.start()
    print("主")

method 2 :

from threading import Thread
import time


class MyThread(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self) -> None:
        print(f"進(jìn)程{self.name}開始")
        time.sleep(2)
        print(f"進(jìn)程{self.name}結(jié)束")


if __name__ == '__main__':
    t = MyThread("1")
    t.start()
    t1 = MyThread("2")
    t1.start()
    t.join()
    t1.join()
    print("主")

三谢肾、統(tǒng)一進(jìn)程下多線程數(shù)據(jù)共享

from threading import Thread

import time

money = 99


def task(n):
    global money
    money=n
    print('開始')
    # time.sleep(n)
    print('結(jié)束')


if __name__ == '__main__':
    t = Thread(target=task, args=(2,))
    t.start()

    t1 = Thread(target=task, args=(66,))
    t1.start()


    t.join()
    t1.join()
    print(money)
    print('主')

線程相關(guān)的其他方法:

Thread實(shí)例對象的方法:

  • isAlive(): 返回線程是否活動的。
  • getName(): 返回線程名状您。
  • setName(): 設(shè)置線程名勒叠。

threading模塊提供的一些方法:

  • threading.currentThread(): 返回當(dāng)前的線程變量。
  • threading.enumerate(): 返回一個(gè)包含正在運(yùn)行的線程的list膏孟。正在運(yùn)行指線程啟動后眯分、結(jié)束前,不包括啟動前和終止后的線程柒桑。
  • threading.activeCount(): 返回正在運(yùn)行的線程數(shù)量弊决,與len(threading.enumerate())有相同的結(jié)果。

四魁淳、守護(hù)線程

無論是進(jìn)程還是線程飘诗,都遵循:守護(hù)xxx會等待主xxx運(yùn)行完畢后被銷毀

需要強(qiáng)調(diào)的是:運(yùn)行完畢并非終止運(yùn)行

  • 1.對主進(jìn)程來說,運(yùn)行完畢指的是主進(jìn)程代碼運(yùn)行完畢

  • 2.對主線程來說界逛,運(yùn)行完畢指的是主線程所在的進(jìn)程內(nèi)所有非守護(hù)線程統(tǒng)統(tǒng)運(yùn)行完畢昆稿,主線程才算運(yùn)行完畢

詳細(xì)解釋:

  • 1 主進(jìn)程在其代碼結(jié)束后就已經(jīng)算運(yùn)行完畢了(守護(hù)進(jìn)程在此時(shí)就被回收),然后主進(jìn)程會一直等非守護(hù)的子進(jìn)程都運(yùn)行完畢后回收子進(jìn)程的資源(否則會產(chǎn)生僵尸進(jìn)程),才會結(jié)束息拜。

  • 2 主線程在其他非守護(hù)線程運(yùn)行完畢后才算運(yùn)行完畢(守護(hù)線程在此時(shí)就被回收)溉潭。因?yàn)橹骶€程的結(jié)束意味著進(jìn)程的結(jié)束,進(jìn)程整體的資源都將被回收少欺,而進(jìn)程必須保證非守護(hù)線程都運(yùn)行完畢后才能結(jié)束喳瓣。

五、GIL全局解釋器鎖

在Cpython解釋器中赞别,同一個(gè)進(jìn)程下開啟的多線程畏陕,同一時(shí)刻只能有一個(gè)線程執(zhí)行,無法利用多核優(yōu)勢仿滔。

  1. python的解釋器有很多惠毁,cpython犹芹,jpython,pypy(python寫的解釋器)

  2. python的庫多仁讨,庫都是基于cpython寫起來的羽莺,其他解釋器沒有那么多的庫

  3. cpython中有一個(gè)全局大鎖实昨,每條線程要執(zhí)行洞豁,必須獲取到這個(gè)鎖

  4. 這個(gè)鎖存在的原因是因?yàn)閜ython的垃圾回收機(jī)制

  5. python的多線程其實(shí)就是單線程

  6. 某個(gè)線程想要執(zhí)行,必須先拿到GIL荒给,我們可以把GIL看作是“通行證”丈挟,并且在一個(gè)python進(jìn)程中,GIL只有一個(gè)志电。拿不到通行證的線程曙咽,就不允許進(jìn)入CPU執(zhí)行

  7. 總結(jié):cpython解釋器中有一個(gè)全局鎖(GIL),線程必須獲取到GIL才能執(zhí)行挑辆,我們開的多線程例朱,不管有幾個(gè)cpu,同一時(shí)刻鱼蝉,只有一個(gè)線程在執(zhí)行(python的多線程洒嗤,不能利用多核優(yōu)勢)

  8. 如果是io密集型操作:開多線程

  9. 如果是計(jì)算密集型:開多進(jìn)程

更詳細(xì)的介紹

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市魁亦,隨后出現(xiàn)的幾起案子渔隶,更是在濱河造成了極大的恐慌,老刑警劉巖洁奈,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件间唉,死亡現(xiàn)場離奇詭異,居然都是意外死亡利术,警方通過查閱死者的電腦和手機(jī)呈野,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來印叁,“玉大人被冒,你說我怎么就攤上這事『砀郑” “怎么了姆打?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肠虽。 經(jīng)常有香客問我幔戏,道長,這世上最難降的妖魔是什么税课? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任闲延,我火速辦了婚禮痊剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垒玲。我一直安慰自己陆馁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布合愈。 她就那樣靜靜地躺著叮贩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佛析。 梳的紋絲不亂的頭發(fā)上益老,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音寸莫,去河邊找鬼捺萌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膘茎,可吹牛的內(nèi)容都是我干的桃纯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼披坏,長吁一口氣:“原來是場噩夢啊……” “哼态坦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刮萌,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驮配,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后着茸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壮锻,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年涮阔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猜绣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敬特,死狀恐怖掰邢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伟阔,我是刑警寧澤辣之,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皱炉,受9級特大地震影響怀估,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一多搀、第九天 我趴在偏房一處隱蔽的房頂上張望歧蕉。 院中可真熱鬧,春花似錦康铭、人聲如沸惯退。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽催跪。三九已至,卻和暖如春呛哟,著一層夾襖步出監(jiān)牢的瞬間叠荠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工扫责, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逃呼。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓鳖孤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抡笼。 傳聞我的和親對象是個(gè)殘疾皇子苏揣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355