python系統(tǒng)編程2

線程

1.1.1 多線程——threading

python的thread模塊是比較底層的模塊秀仲,python的threading模塊是對(duì)thread做了一些包裝的凝赛,可以更加方便的被使用

1.1.2 使用threading模塊

單線程執(zhí)行

importtime

defsaySorry():

print("親愛的邑闺,我錯(cuò)了,我能吃飯了嗎前计?")

time.sleep(1)

if__name__ =="__main__":

foriinrange(5):

saySorry()

多線程執(zhí)行

importthreading

importtime

defsaySorry():

print("親愛的潜秋,我錯(cuò)了,我能吃飯了嗎疾捍?")

time.sleep(1)

if__name__ =="__main__":

foriinrange(5):

t = threading.Thread(target=saySorry)

t.start()#啟動(dòng)線程奈辰,即讓線程開始執(zhí)行

說(shuō)明

1.可以明顯看出使用了多線程并發(fā)的操作,花費(fèi)時(shí)間要短很多

2.創(chuàng)建好的線程拾氓,需要調(diào)用start()方法來(lái)啟動(dòng)

1.1.3 主線程會(huì)等待所有子線程結(jié)束后才結(jié)束

importthreading

fromtimeimportsleep,ctime

defsing():

foriinrange(3):

print("正在唱歌...%d"%i)

sleep(1)

defdance():

foriinrange(3):

print("正在跳舞...%d"%i)

sleep(1)

if__name__ =='__main__':

print('---開始---:%s'%ctime())

t1 = threading.Thread(target=sing)

t2 = threading.Thread(target=dance)

t1.start()

t2.start()

#sleep(5) #屏蔽此行代碼冯挎,試試看,程序是否會(huì)立馬結(jié)束?

print('---結(jié)束---:%s'%ctime())

1.1.4 查看線程數(shù)量

importthreading

fromtimeimportsleep,ctime

defsing():

foriinrange(3):

print("正在唱歌...%d"%i)

sleep(1)

defdance():

foriinrange(3):

print("正在跳舞...%d"%i)

sleep(1)

if__name__ =='__main__':

print('---開始---:%s'%ctime())

t1 = threading.Thread(target=sing)

t2 = threading.Thread(target=dance)

t1.start()

t2.start()

whileTrue:

length = len(threading.enumerate())

print('當(dāng)前運(yùn)行的線程數(shù)為:%d'%length)

iflength<=1:

break

sleep(0.5)

1.2 threating注意點(diǎn)

1.2.1 線程執(zhí)行代碼的封裝

通過(guò)上一小節(jié)房官,能夠看出趾徽,通過(guò)使用threading模塊能完成多任務(wù)的程序開發(fā),為了讓每個(gè)線程的封裝性更完美翰守,所以使用threading模塊時(shí)孵奶,往往會(huì)定義一個(gè)新的子類class,只要繼承threading.Thread就可以了蜡峰,然后重寫run方法

示例如下:

importthreading

importtime

classMyThread(threading.Thread):

defrun(self):

foriinrange(3):

time.sleep(1)

msg ="I'm "+self.name+' @ '+str(i)#name屬性中保存的是當(dāng)前線程的名字

print(msg)

if__name__ =='__main__':

t = MyThread()

t.start()

說(shuō)明

·python的threading.Thread類有一個(gè)run方法了袁,用于定義線程的功能函數(shù),可以在自己的線程類中覆蓋該方法湿颅。而創(chuàng)建自己的線程實(shí)例后载绿,通過(guò)Thread類的start方法,可以啟動(dòng)該線程油航,交給python虛擬機(jī)進(jìn)行調(diào)度崭庸,當(dāng)該線程獲得執(zhí)行的機(jī)會(huì)時(shí),就會(huì)調(diào)用run方法執(zhí)行線程谊囚。

1.2.1 線程的執(zhí)行順序

#coding=utf-8

importthreading

importtime

classMyThread(threading.Thread):

defrun(self):

foriinrange(3):

time.sleep(1)

msg ="I'm "+self.name+' @ '+str(i)

print(msg)

deftest():

foriinrange(5):

t = MyThread()

t.start()

if__name__ =='__main__':

test()

執(zhí)行結(jié)果:(運(yùn)行的結(jié)果可能不一樣怕享,但是大體是一致的)

I'm Thread-1 @ 0

I'm Thread-2 @ 0

I'm Thread-5 @ 0

I'm Thread-3 @ 0

I'm Thread-4 @ 0

I'm Thread-3 @ 1

I'm Thread-4 @ 1

I'm Thread-5 @ 1

I'm Thread-1 @ 1

I'm Thread-2 @ 1

I'm Thread-4 @ 2

I'm Thread-5 @ 2

I'm Thread-2 @ 2

I'm Thread-1 @ 2

I'm Thread-3 @ 2

說(shuō)明

從代碼和執(zhí)行結(jié)果我們可以看出,多線程程序的執(zhí)行順序是不確定的镰踏。當(dāng)執(zhí)行到sleep語(yǔ)句時(shí)函筋,線程將被阻塞(Blocked),到sleep結(jié)束后奠伪,線程進(jìn)入就緒(Runnable)狀態(tài)跌帐,等待調(diào)度。而線程調(diào)度將自行選擇一個(gè)線程執(zhí)行绊率。上面的代碼中只能保證每個(gè)線程都運(yùn)行完整個(gè)run函數(shù)含末,但是線程的啟動(dòng)順序、run函數(shù)中每次循環(huán)的執(zhí)行順序都不能確定即舌。

總結(jié)

1.每個(gè)線程一定會(huì)有一個(gè)名字佣盒,盡管上面的例子中沒(méi)有指定線程對(duì)象的name,但是python會(huì)自動(dòng)為線程指定一個(gè)名字顽聂。

2.當(dāng)線程的run()方法結(jié)束時(shí)該線程完成肥惭。

3.無(wú)法控制線程調(diào)度程序,但可以通過(guò)別的方式來(lái)影響線程調(diào)度的方式紊搪。

4.線程的幾種狀態(tài)


1.3 多線程-共享全局變量

fromthreadingimportThread

importtime

g_num =100

defwork1():

globalg_num

foriinrange(3):

g_num +=1

print("----in work1, g_num is %d---"%g_num)

defwork2():

globalg_num

print("----in work2, g_num is %d---"%g_num)

print("---線程創(chuàng)建之前g_num is %d---"%g_num)

t1 = Thread(target=work1)

t1.start()

#延時(shí)一會(huì)蜜葱,保證t1線程中的事情做完

time.sleep(1)

t2 = Thread(target=work2)

t2.start()

運(yùn)行結(jié)果:

---線程創(chuàng)建之前g_numis100---

----inwork1, g_numis103---

----inwork2, g_numis103---

列表當(dāng)做實(shí)參傳遞到線程中

fromthreadingimportThread

importtime

defwork1(nums):

nums.append(44)

print("----in work1---",nums)

defwork2(nums):

#延時(shí)一會(huì),保證t1線程中的事情做完

time.sleep(1)

print("----in work2---",nums)

g_nums = [11,22,33]

t1 = Thread(target=work1, args=(g_nums,))

t1.start()

t2 = Thread(target=work2, args=(g_nums,))

t2.start()

運(yùn)行結(jié)果:

----inwork1--- [11,22,33,44]

----inwork2--- [11,22,33,44]

總結(jié):

·在一個(gè)進(jìn)程內(nèi)的所有線程共享全局變量耀石,能夠在不適用其他方式的前提下完成多線程之間的數(shù)據(jù)共享(這點(diǎn)要比多進(jìn)程要好)

·缺點(diǎn)就是牵囤,線程是對(duì)全局變量隨意遂改可能造成多線程之間對(duì)全局變量的混亂(即線程非安全)

1.4 進(jìn)程vs 線程

1.4.1 功能

·進(jìn)程,能夠完成多任務(wù),比如在一臺(tái)電腦上能夠同時(shí)運(yùn)行多個(gè)QQ

·線程揭鳞,能夠完成多任務(wù)炕贵,比如一個(gè)QQ中的多個(gè)聊天窗口

1.4.2 定義的不同

·進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.

·線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.

1.4.3 區(qū)別

·一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.

·線程的劃分尺度小于進(jìn)程(資源比進(jìn)程少),使得多線程程序的并發(fā)性高野崇。

·進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元称开,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率

·線程不能夠獨(dú)立執(zhí)行乓梨,必須依存在進(jìn)程中

1.4.4 優(yōu)缺點(diǎn)

線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小鳖轰,但不利于資源的管理和保護(hù);而進(jìn)程正相反扶镀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蕴侣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子臭觉,更是在濱河造成了極大的恐慌睛蛛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胧谈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荸频,警方通過(guò)查閱死者的電腦和手機(jī)菱肖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)旭从,“玉大人稳强,你說(shuō)我怎么就攤上這事『驮茫” “怎么了退疫?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鸽素。 經(jīng)常有香客問(wèn)我褒繁,道長(zhǎng),這世上最難降的妖魔是什么馍忽? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任棒坏,我火速辦了婚禮,結(jié)果婚禮上遭笋,老公的妹妹穿的比我還像新娘坝冕。我一直安慰自己,他們只是感情好瓦呼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布喂窟。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磨澡。 梳的紋絲不亂的頭發(fā)上碗啄,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音钱贯,去河邊找鬼挫掏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秩命,可吹牛的內(nèi)容都是我干的尉共。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弃锐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袄友!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起霹菊,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤剧蚣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后旋廷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸠按,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年饶碘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了目尖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扎运,死狀恐怖瑟曲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豪治,我是刑警寧澤洞拨,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站负拟,受9級(jí)特大地震影響烦衣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掩浙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一琉挖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涣脚,春花似錦示辈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纱耻。三九已至,卻和暖如春险耀,著一層夾襖步出監(jiān)牢的瞬間弄喘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工甩牺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蘑志,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓贬派,卻偏偏與公主長(zhǎng)得像急但,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搞乏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 線程 1.同步概念 1.多線程開發(fā)可能遇到的問(wèn)題 同步不是一起的意思波桩,是協(xié)同步調(diào) 假設(shè)兩個(gè)線程t1和t2都要對(duì)nu...
    TENG書閱讀 602評(píng)論 0 1
  • 1.進(jìn)程和線程 隊(duì)列:1、進(jìn)程之間的通信: q = multiprocessing.Queue()2请敦、...
    一只寫程序的猿閱讀 1,098評(píng)論 0 17
  • 線程狀態(tài)新建镐躲,就緒,運(yùn)行侍筛,阻塞萤皂,死亡。 線程同步多線程可以同時(shí)運(yùn)行多個(gè)任務(wù)匣椰,線程需要共享數(shù)據(jù)的時(shí)候裆熙,可能出現(xiàn)數(shù)據(jù)不...
    KevinCool閱讀 793評(píng)論 0 0
  • 2017年5月23日,懷著對(duì)新鮮事物的好奇心窝爪,針對(duì)自身知識(shí)的缺乏性,我毅然加入了自控力讀寫族這個(gè)大家庭齐媒。 這個(gè)大家...
    狩望_佛山閱讀 214評(píng)論 3 14
  • 決定何時(shí)重構(gòu)蒲每、何時(shí)停止和知道如何重構(gòu)一樣重要! 開發(fā)者必須通過(guò)實(shí)踐培養(yǎng)自己的經(jīng)驗(yàn)和直覺喻括,培養(yǎng)出自己的判斷力:學(xué)會(huì)判...
    程序熊大閱讀 1,981評(píng)論 2 32