自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對(duì)Python線程實(shí)體說(shuō)明介紹

開(kāi)發(fā) 后端
Python線程和進(jìn)程的區(qū)別在于,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個(gè)線程則共享數(shù)據(jù)空間,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文。

Python線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,希望大家能夠從中得到自己想要的知識(shí)。

我們?cè)谧鲕浖_(kāi)發(fā)的時(shí)候很多要用到多線程技術(shù)。例如如果做一個(gè)下載軟件象flashget就要用到、象在線視頻工具realplayer也要用到因?yàn)橐瑫r(shí)下載media stream還要播放。其實(shí)例子是很多的。

線程相對(duì)進(jìn)程來(lái)說(shuō)是“輕量級(jí)”的,操作系統(tǒng)用較少的資源創(chuàng)建和管理線程。程序中的線程在相同的內(nèi)存空間中執(zhí)行,并共享許多相同的資源。在python中如何創(chuàng)建一個(gè)線程對(duì)象:如果你要?jiǎng)?chuàng)建一個(gè)線程對(duì)象,很簡(jiǎn)單,只要你的類繼承threading.Thread,然后在__init__里首先調(diào)用threading.Thread的__init__方法即可:

  1. t1 = mythread('t1')  
  2. print t1.getName(),t1.isDaemon()  
  3. t1.setDaemon(True)  
  4. print t1.getName(),t1.isDaemon()  
  5. t1.start()  
  6. print 'main thread exit' 

這才僅僅是個(gè)空線程,我可不是要他拉空車的,他可得給我干點(diǎn)實(shí)在活。很簡(jiǎn)單,重寫類的run()方法即可,把你要在線程執(zhí)行時(shí)做的事情都放到里面。以上代碼我們讓這個(gè)線程在執(zhí)行之后每隔1秒輸出一次信息到屏幕,10次后結(jié)束getName()是threading.Thread類的一個(gè)方法,用來(lái)獲得這個(gè)線程對(duì)象的name。

還有一個(gè)方法setName()當(dāng)然就是來(lái)設(shè)置這個(gè)線程對(duì)象的name的了。如果要?jiǎng)?chuàng)建一個(gè)線程,首先就要先創(chuàng)建一個(gè)線程對(duì)象。一個(gè)線程對(duì)象被創(chuàng)建后,他就處于“born”(誕生狀態(tài)),如何讓這個(gè)線程對(duì)象開(kāi)始運(yùn)行呢?只要調(diào)用線程對(duì)象的start()方法即可:

奇怪嗎?不是已經(jīng)start了嗎?為什么不稱為“running”狀態(tài)呢?其實(shí)是有原因的。因?yàn)槲覀兊挠?jì)算機(jī)一般是不具有真正并行處理能力的。我們所謂的多線程只是把時(shí)間分成片段,然后隔一個(gè)時(shí)間段就讓一個(gè)線程執(zhí)行一下,然后進(jìn)入“sleeping ”狀態(tài),然后喚醒另一個(gè)在“sleeping”的線程。

如此循環(huán)runnable->sleeping->runnable... ,只是因?yàn)橛?jì)算機(jī)執(zhí)行速度很快,而時(shí)間片段間隔很小,我們感受不到,以為是同時(shí)進(jìn)行的。所以說(shuō)一個(gè)線程在start了之后只是處在了可以運(yùn)行的狀態(tài),他什么時(shí)候運(yùn)行還是由系統(tǒng)來(lái)進(jìn)行調(diào)度的。#t#

那一個(gè)線程什么時(shí)候會(huì)Python線程呢?一般來(lái)說(shuō)當(dāng)線程對(duì)象的run方法執(zhí)行結(jié)束或者在執(zhí)行中拋出異常的話,那么這個(gè)線程就會(huì)結(jié)束了。系統(tǒng)會(huì)自動(dòng)對(duì)“dead”狀態(tài)線程進(jìn)行清理。如果一個(gè)線程t1在執(zhí)行的過(guò)程中需要等待另一個(gè)線程t2執(zhí)行結(jié)束后才能運(yùn)行的話那就可以在t1在調(diào)用t2的join()方法。

這樣t1在執(zhí)行到Python線程語(yǔ)句后就會(huì)等待t2結(jié)束后才會(huì)繼續(xù)運(yùn)行,如果一個(gè)進(jìn)程的主線程運(yùn)行完畢而子線程還在執(zhí)行的話,那么進(jìn)程就不會(huì)退出,直到所有子線程結(jié)束為止,如何讓主線程結(jié)束的時(shí)候其他子線程也乖乖的跟老大撤退呢?

那就要把那些不聽(tīng)話的人設(shè)置為聽(tīng)話的小弟,使用線程對(duì)象的setDaemon()方法,參數(shù)為bool型。True的話就代表你要聽(tīng)話,我老大(主線程)扯呼,你也要跟著撤,不能拖后腿。如果是False的話就不用那么聽(tīng)話了,老大允許你們將在外軍命有所不受的。需要注意的是setDaemon()方法必須在線程對(duì)象沒(méi)有調(diào)用start()方法之前調(diào)用,否則沒(méi)效果。

【編輯推薦】

  1. 如何使Python嵌入C++應(yīng)用程序?
  2. 深入探討Ruby與Python語(yǔ)法比較
  3. Python學(xué)習(xí)資料介紹分享
  4. Python學(xué)習(xí)經(jīng)驗(yàn)談:版本、IDE選擇及編碼解決方案
  5. 淺析Python的GIL和線程安全
責(zé)任編輯:chenqingxiang 來(lái)源: 計(jì)世網(wǎng)
相關(guān)推薦

2010-03-01 13:13:02

Python應(yīng)用線程

2010-02-02 13:28:46

Python變量

2010-02-22 11:14:43

Python編寫

2010-02-26 13:56:08

Python RSS

2010-02-26 10:07:55

Python編程語(yǔ)言

2010-02-24 16:44:58

Python 函數(shù)

2010-02-26 09:42:52

Python線程池

2009-12-08 16:09:02

WCF消息

2009-12-21 10:01:05

Oracle技術(shù)

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2009-12-14 17:44:39

Visual Stud

2010-01-14 13:39:45

Visual C++優(yōu)

2010-01-15 19:34:25

C++設(shè)計(jì)

2010-01-05 13:29:50

JSON對(duì)象

2010-02-02 14:54:28

Python語(yǔ)法

2010-02-03 17:37:30

Python語(yǔ)法

2010-02-01 18:06:48

Python Edit

2010-02-22 16:16:14

Python語(yǔ)法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)