posts - 431,  comments - 344,  trackbacks - 0
          我們在做軟件開發(fā)的時候很多要用到多線程技術(shù)。例如如果做一個下載軟件象flashget就要用到、象在線視頻工具realplayer也要用到因?yàn)橐瑫r下載media stream還要播放。其實(shí)例子是很多的。

              線程相對進(jìn)程來說是“輕量級”的,操作系統(tǒng)用較少的資源創(chuàng)建和管理線程。程序中的線程在相同的內(nèi)存空間中執(zhí)行,并共享許多相同的資源。

              在python中如何創(chuàng)建一個線程對象

              如果你要創(chuàng)建一個線程對象,很簡單,只要你的類繼承threading.Thread,然后在__init__里首先調(diào)用threading.Thread__init__方法即可

              import threading
              class mythread(threading.Thread):
                  def __init__(self, threadname):
                      threading.Thread.__init__(self, name = threadname)
                  ....

              這才僅僅是個空線程,我可不是要他拉空車的,他可得給我干點(diǎn)實(shí)在活。很簡單,重寫類的run()方法即可,把你要在線程執(zhí)行時做的事情都放到里面

              import threading
              import time
              class mythread(threading.Thread):
                  def __init__(...):
                      ....
                  def run(self):
                      for i in range(10):
                          print self.getName, i
                      time.sleep(1)

              以上代碼我們讓這個線程在執(zhí)行之后每隔1秒輸出一次信息到屏幕,10次后結(jié)束

              getName()threading.Thread類的一個方法,用來獲得這個線程對象的name。還有一個方法setName()當(dāng)然就是來設(shè)置這個線程對象的name的了。

              如果要創(chuàng)建一個線程,首先就要先創(chuàng)建一個線程對象

              mythread1 = mythread('mythread 1')

              一個線程對象被創(chuàng)建后,他就處于“born”(誕生狀態(tài))

              如何讓這個線程對象開始運(yùn)行呢?只要調(diào)用線程對象的start()方法即可

              mythread1.start()

              現(xiàn)在線程就處于“ready”狀態(tài)或者也稱為“runnable”狀態(tài)。

              奇怪嗎?不是已經(jīng)start了嗎?為什么不稱為“running”狀態(tài)呢?其實(shí)是有原因的。因?yàn)槲覀兊挠?jì)算機(jī)一般是不具有真正并行處理能力的。我們所謂的多線程只是把時間分成片段,然后隔一個時間段就讓一個線程執(zhí)行一下,然后進(jìn)入“sleeping ”狀態(tài),然后喚醒另一個在“sleeping”的線程,如此循環(huán)runnable->sleeping->runnable... ,只是因?yàn)橛?jì)算機(jī)執(zhí)行速度很快,而時間片段間隔很小,我們感受不到,以為是同時進(jìn)行的。所以說一個線程在start了之后只是處在了可以運(yùn)行的狀態(tài),他什么時候運(yùn)行還是由系統(tǒng)來進(jìn)行調(diào)度的。

              那一個線程什么時候會“dead”呢?一般來說當(dāng)線程對象的run方法執(zhí)行結(jié)束或者在執(zhí)行中拋出異常的話,那么這個線程就會結(jié)束了。系統(tǒng)會自動對“dead”狀態(tài)線程進(jìn)行清理。

              如果一個線程t1在執(zhí)行的過程中需要等待另一個線程t2執(zhí)行結(jié)束后才能運(yùn)行的話那就可以在t1在調(diào)用t2join()方法

              ....
              def t1(...):
                  ...
                  t2.join()
                  ...

              這樣t1在執(zhí)行到t2.join()語句后就會等待t2結(jié)束后才會繼續(xù)運(yùn)行。

              但是假如t1是個死循環(huán)的話那么等待就沒有意義了,那怎么辦呢?可以在調(diào)用t2join()方法的時候給一個浮點(diǎn)數(shù)做超時參數(shù),這樣這個線程就不會等到花兒也謝了了。我等你10s,你不回來我還不允許我改嫁啊?:)

              def t1(...):
                  ...
                  t2.join(10)
                  ...

              如果一個進(jìn)程的主線程運(yùn)行完畢而子線程還在執(zhí)行的話,那么進(jìn)程就不會退出,直到所有子線程結(jié)束為止,如何讓主線程結(jié)束的時候其他子線程也乖乖的跟老大撤退呢?那就要把那些不聽話的人設(shè)置為聽話的小弟,使用線程對象的setDaemon()方法,參數(shù)為bool型。True的話就代表你要聽話,我老大(主線程)扯呼,你也要跟著撤,不能拖后腿。如果是False的話就不用那么聽話了,老大允許你們將在外軍命有所不受的。需要注意的是setDaemon()方法必須在線程對象沒有調(diào)用start()方法之前調(diào)用,否則沒效果。

              t1 = mythread('t1')
              print t1.getName(),t1.isDaemon()
              t1.setDaemon(True)
              print t1.getName(),t1.isDaemon()
              t1.start()
              print 'main thread exit'

              當(dāng)執(zhí)行到 print 'main thread exit' 后,主線程就退出了,當(dāng)然t1這個線程也跟著結(jié)束了。但是如果不使用t1線程對象的setDaemon()方法的話,即便主線程結(jié)束了,還要等待t1線程自己結(jié)束才能退出進(jìn)程。isDaemon()是用來獲得一個線程對象的Daemonflag狀態(tài)的。

              如何來獲得與線程有關(guān)的信息呢?

              獲得當(dāng)前正在運(yùn)行的線程的引用

              running = threading.currentThread()

              獲得當(dāng)前所有活動對象(即run方法開始但是未終止的任何線程)的一個列表

              threadlist = threading.enumerate()

              獲得這個列表的長度

              threadcount = threading.activeCount()

              查看一個線程對象的狀態(tài)調(diào)用這個線程對象的isAlive()方法,返回1代表處于“runnable”狀態(tài)且沒有“dead

              threadflag = threading.isAlive()

          posted on 2007-09-25 16:01 周銳 閱讀(523) 評論(0)  編輯  收藏 所屬分類: Python
          主站蜘蛛池模板: 开化县| 绥阳县| 镇江市| 内丘县| 土默特左旗| 黔西县| 南部县| 大关县| 德令哈市| 正宁县| 克山县| 湛江市| 同德县| 襄城县| 泸州市| 稻城县| 错那县| 团风县| 夏邑县| 绍兴市| 津南区| 石屏县| 平阴县| 乌兰察布市| 马鞍山市| 葵青区| 宁化县| 盐池县| 虎林市| 聂荣县| 绥中县| 云龙县| 黄大仙区| 正镶白旗| 三门峡市| 甘洛县| 昆明市| 会理县| 雅江县| 常德市| 青田县|