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

手把手教您Python多線程應用技巧

開發(fā) 后端
在編程語言中,多線程的應用是一個比較重要的應用技術(shù),對于Python來說同樣重要,文章將主要講解了Python多線程在實際應用的技巧。

在編程語言中,多線程的應用是一個比較重要的應用技術(shù),那么Python中的多線程應用同樣也是非常重要的。線程相對進程來說是“輕量級”的,操作系統(tǒng)用較少的資源創(chuàng)建和管理線程。程序中的線程在相同的內(nèi)存空間中執(zhí)行,并共享許多相同的資源。

51CTO推薦閱讀:Python多線程具體運用的方法

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

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

  1. import threading    
  2. class mythread(threading.Thread):    
  3. def __init__(self, threadname):    
  4. threading.Thread.__init__(self, name = threadname)    
  5. … 

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

  1. import threading    
  2. import time    
  3. class mythread(threading.Thread):    
  4. def __init__(…):  ….    
  5. def run(self):    
  6. for i in range(10):    
  7. print self.getName, i  time.sleep(1) 

以上代碼我們讓這個線程在執(zhí)行之后每隔1秒輸出一次信息到屏幕,10次后結(jié)束getName()是threading.Thread類的一個方法,用來獲得這個線程對象的name。還有一個方法setName()當然就是來設(shè)置這個線程對象的name的了。

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

  1. mythreadmythreadmythread1 = mythread(’mythread 1′)
  2.  

一個線程對象被創(chuàng)建后,他就處于“born”(誕生狀態(tài)),如何讓這個Python多線程對象開始運行呢?只要調(diào)用線程對象的start()方法即可:

  1. mythread1.start()
  2.  

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

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

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

  1. ….    
  2. def t1(…):    
  3. …    
  4. t2.join()    
  5. … 

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

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

  1. def t1(…):    
  2. …    
  3. t2.join(10)    
  4. … 

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

  1. t1 = mythread(’t1′)    
  2. print t1.getName(),  
  3. t1.isDaemon()    
  4. t1.setDaemon(True)    
  5. print t1.getName(),  
  6. t1.isDaemon()    
  7. t1.start()  print   
  8. ‘main thread exit’ 

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

如何來獲得與Python多線程有關(guān)的信息呢?獲得當前正在運行的線程的引用:

  1. running = threading.currentThread() 
  2.  

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

  1. threadlist = threading.enumerate()
  2.   

獲得這個列表的長度:

  1. threadcount = threading.activeCount() 
  2.  

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

  1. threadflag = threading.isAlive()
  2.    

 

【編輯推薦】

  1. 使用Python輕松收集Web站點數(shù)據(jù)
  2. 加速程序開發(fā) Python整合C語言模塊
  3. 對Python特色的詳細介紹
  4. Python 變量類型的代碼示例
  5. Python數(shù)據(jù)結(jié)構(gòu)如何進行內(nèi)建詳解
責任編輯:王曉東 來源: 歲月聯(lián)盟
相關(guān)推薦

2020-11-10 09:00:00

JavaMule ESB開發(fā)

2010-08-18 09:15:45

路由器網(wǎng)絡(luò)診斷

2009-10-21 10:47:03

Siliverligh

2020-09-23 07:00:00

Selenium We架構(gòu)

2010-09-14 09:24:27

家庭無線網(wǎng)絡(luò)

2010-09-02 10:50:17

時間同步服務(wù)器

2010-08-26 09:24:59

路由器網(wǎng)絡(luò)診斷

2020-02-21 10:45:06

運維架構(gòu)技術(shù)

2010-04-02 16:51:09

虛擬機安裝linux

2022-09-14 17:12:15

flowable源碼DEMO

2009-11-06 10:44:31

Visual Stud

2011-02-15 09:43:33

虛擬機

2009-12-02 10:16:55

備份Cisco路由器配

2010-03-10 11:16:31

服務(wù)器DIY

2023-10-28 08:51:35

Java多線程服務(wù)

2021-02-04 11:53:49

Linuxplatform總線

2020-09-04 10:14:02

Linux驅(qū)動7內(nèi)核

2020-09-27 06:59:59

IO系統(tǒng)Linux

2020-02-21 19:54:09

HTTPS 配置手把手教

2023-03-27 00:06:12

點贊
收藏

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