日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Python多線程實(shí)際編程方式淺析

在編程語言中,多線程的應(yīng)用是一個(gè)比較重要的應(yīng)用技術(shù)。那么,Python編程語中的多線程應(yīng)用同樣也是非常重要的。我們今天就會(huì)為大家詳細(xì)介紹一下有關(guān)Python多線程的相關(guān)應(yīng)用技巧。#t#

線程相對(duì)進(jìn)程來說是“輕量級(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. import threading  
  2. class mythread(threading.Thread):  
  3. def __init__(self, threadname):  
  4. threading.Thread.__init__(self, name = threadname)  
  5. … 

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

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

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

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

如果要?jiǎng)?chuàng)建一個(gè)線程,首先就要先創(chuàng)建一個(gè)線程對(duì)象

 
 
 
  1. mythreadmythread1 = mythread(’mythread 1′) 

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

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

 
 
 
  1. mythread1.start() 

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

奇怪嗎?不是已經(jīng)start了嗎?為什么不稱為“running”狀態(tài)呢?其實(shí)是有原因的。因?yàn)槲覀兊挠?jì)算機(jī)一般是不具有真正并行處理能力的。我們所謂的Python多線程只是把時(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)行的。所以說一個(gè)線程在start了之后只是處在了可以運(yùn)行的狀態(tài),他什么時(shí)候運(yùn)行還是由系統(tǒng)來進(jìn)行調(diào)度的。

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

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

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

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

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

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

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

 
 
 
  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’ 

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

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

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

 
 
 
  1. running = threading.currentThread() 

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

 
 
 
  1. threadlist = threading.enumerate() 

獲得這個(gè)列表的長(zhǎng)度

 
 
 
  1. threadcount = threading.activeCount() 

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

 
 
 
  1. threadflag = threading.isAlive() 

以上就是我們?yōu)榇蠹以敿?xì)介紹的有關(guān)Python多線程的相關(guān)內(nèi)容。


文章名稱:Python多線程實(shí)際編程方式淺析
URL鏈接:http://m.5511xx.com/article/cocoopg.html