最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多線程實(shí)例教程

 更新時(shí)間:2014年09月06日 11:49:39   投稿:shichen2014  
這篇文章主要介紹了Python多線程,對(duì)比了新舊版本的Python在實(shí)現(xiàn)多線程的特點(diǎn),并采用threading模塊的實(shí)例來講述了多線程的技巧,需要的朋友可以參考下

本文以實(shí)例形式較為詳細(xì)的講解了Python的多線程,是Python程序設(shè)計(jì)中非常重要的知識(shí)點(diǎn)。分享給大家供大家參考之用。具體方法如下:

用過Python的人都會(huì)覺得Python的多線程很類似于Java的多線程機(jī)制,但是比JAVA的多線程更靈活。在早期的Python多線程實(shí)現(xiàn)中,采用了thread模塊。例如:  

from time import ctime,sleep 
from thread import start_new_thread 
def loop1(): 
  print "enter loop1:",ctime(); 
  sleep(3); 
  print "leave loop1:",ctime(); 
 
def loop2(): 
  print "enter loop2:",ctime(); 
  sleep(5); 
  print "leave loop2:",ctime(); 
 
def main(): 
  print "main begin:",ctime(); 
  start_new_thread(loop1, ()); 
  start_new_thread(loop2,()); 
  sleep(8); 
  print "main end:",ctime(); 
 
if __name__=="__main__": 
  main(); 

簡(jiǎn)單介紹下這個(gè)代碼塊中的函數(shù)功能,sleep是線程睡眠時(shí)間,幾乎等價(jià)于JAVA中的Thread.sleep(millionseconds)

start_new_thread是實(shí)例化一個(gè)線程并運(yùn)行的方法,方法的第一個(gè)參數(shù)接受一個(gè)線程運(yùn)行時(shí)所執(zhí)行的函數(shù)對(duì)象,第二個(gè)參數(shù)是方法執(zhí)行時(shí)所需要的參數(shù),以一個(gè)元組的形式傳入。  

這大概是最早期的Python多線程實(shí)現(xiàn)了,注意代碼中的main線程里的sleep(8)。這里的睡眠時(shí)間只能比3+5大,而不能小。如果小于這個(gè)時(shí)間,那么main主線程會(huì)提前退出,導(dǎo)致無論其子線程是否是后臺(tái)線程,都將會(huì)中斷,從而拋出線程中斷異常,類似于Java的ThreadInterruptException。這個(gè)致命的影響幾乎就是這個(gè)模塊后期被拋棄的罪魁禍?zhǔn)住?/p>

當(dāng)然在早期的Python多線程中,你可以利用加鎖的機(jī)制來避免出現(xiàn)這個(gè)情況。稍微改動(dòng)下以上代碼:

import thread; 
from time import sleep,ctime; 
from random import choice 
#The first param means the thread number 
#The second param means how long it sleep 
#The third param means the Lock 
def loop(nloop,sec,lock): 
  print "Thread ",nloop," start and will sleep ",sec; 
  sleep(sec); 
  print "Thread ",nloop," end ",sec; 
  lock.release(); 
 
def main(): 
  seconds=[4,2]; 
  locks=[]; 
  for i in range(len(seconds)) : 
    lock=thread.allocate_lock(); 
    lock.acquire(); 
    locks.append(lock); 
     
  print "main Thread begins:",ctime(); 
  for i,lock in enumerate(locks): 
    thread.start_new_thread(loop,(i,choice(seconds),lock)); 
  for lock in locks : 
    while lock.locked() :  
      pass; 
  print "main Thread ends:",ctime(); 
 
if __name__=="__main__" : 
  main(); 

這里對(duì)Python線程運(yùn)行時(shí)加入了鎖監(jiān)控機(jī)制,介紹下紅色字體標(biāo)志的幾個(gè)方法(其實(shí)紅色字體中的lock實(shí)質(zhì)是thread.lockType實(shí)例。

從以上介紹可以看出這個(gè)Lock類非常類似于JDK5.0中的java.util.concurrent.locks.Lock。不知道Doug Lea有沒有參與這個(gè)模塊的開發(fā),只是比JAVA中的LOCK類多了一個(gè)方法locked,用于檢測(cè)Lock對(duì)象是否還處于加鎖的狀態(tài)。

所以上一個(gè)例子的工作原理就是在啟動(dòng)線程的時(shí)候,給每個(gè)線程都加了一把鎖,直到線程運(yùn)行介紹,再釋放這個(gè)鎖。同時(shí)在Python的main線程中用一個(gè)while循環(huán)來不停的判斷每個(gè)線程鎖已釋放。這個(gè)方法雖然避免了最開始的例子中人為的時(shí)間控制,但是還不方便,高效。

所以在較新的Python版本中,都推薦使用threading模塊。

看下threading模塊的API,有過JAVA開發(fā)經(jīng)驗(yàn)的會(huì)發(fā)現(xiàn)它和java.lang.Thread類非常接近。這里需要說的一點(diǎn)就是threading的run方法可以返回函數(shù)值,這點(diǎn)在用于跟蹤和判斷線程運(yùn)行正常與否非常有作用。

threading模塊支持三種方法來創(chuàng)建線程。而前兩種方式都與其Thread類有關(guān)??聪滤暮?jiǎn)要說明:

class Thread(_Verbose) : 
   __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None) 

其中target指的是一個(gè)具體的函數(shù),或者可調(diào)用的類實(shí)例(這里指實(shí)現(xiàn)了__call__方法的類實(shí)例)

第一種方法:指定線程運(yùn)行的時(shí)候調(diào)用的函數(shù)。舉例如下:

from time import ctime,sleep 
import threading; 
from random import choice 
 
def loop(number,sec): 
  print "Thread ",number," begins and will sleep ",sec," at ",ctime(); 
  sleep(sec); 
  print "Thread ",number,"ends at ",ctime(); 
   
def main(): 
  seconds=[2,4]; 
  threads=[]; 
  array=range(len(seconds)); 
  for i in array : 
    t=threading.Thread(target=loop,args=(i,choice(seconds))); 
    threads.append(t); 
  print "main Thread begins at ",ctime(); 
  for t in threads : 
    t.start(); 
  for t in threads : 
    t.join();     
  print "main Thread ends at ",ctime(); 
 
if __name__=="__main__" : 
  main(); 
 

這里target指向了一個(gè)具體的函數(shù)對(duì)象,而args傳入了該方法調(diào)用時(shí)所必須的參數(shù)。這里傳入了一個(gè)隨即的睡眠時(shí)間。其中thread.join表示要等待該線程終止,和java中的Thread.join(long millionseconds)作用一樣,如果不指定具體的時(shí)間的話,將會(huì)一直等待下去。

第二種方法就是指定一個(gè)可調(diào)用的類實(shí)例,實(shí)際上與前面一種非常的接近。如下所示:

from time import ctime,sleep 
import threading; 
from random import choice 
 
class ThreadFunc(object): 
  def __init__(self,func,args,name): 
    self.func=func; 
    self.args=args; 
    self.name=name; 
     
  def __call__(self): 
    self.func(*self.args); 
 
def loop(number,sec): 
  print "Thread ",number," begins and will sleep ",sec," at ",ctime(); 
  sleep(sec); 
  print "Thread ",number,"ends at ",ctime(); 
   
def main(): 
  seconds=[2,4]; 
  threads=[]; 
  array=range(len(seconds)); 
  for i in array : 
    t=threading.Thread(target=ThreadFunc(loop,(i,choice(seconds)),loop.__name__)); 
    threads.append(t); 
  print "main Thread begins at ",ctime(); 
  for t in threads : 
    t.start(); 
  for t in threads : 
    t.join();     
  print "main Thread ends at ",ctime(); 
 
if __name__=="__main__" : 
  main(); 

這里只是將target指向從一個(gè)函數(shù)對(duì)象變成了一個(gè)可調(diào)用的類實(shí)例。

重點(diǎn)推薦下第三種方式,用繼承threading.Thread的方式來實(shí)現(xiàn)線程,有過Java多線程應(yīng)用的朋友一定會(huì)對(duì)下面的例子非常熟悉。

from time import ctime,sleep 
import threading; 
from random import choice 
 
class MyThread(threading.Thread): 
  def __init__(self,func,args,name): 
    super(MyThread,self).__init__(); 
    self.func=func; 
    self.args=args; 
    self.name=name; 
       
  def run(self): 
    self.result=self.func(*self.args); 
 
  def getResult(self): 
    return self.result; 
   
def loop(number,sec): 
  print "Thread ",number," begins and will sleep ",sec," at ",ctime(); 
  sleep(sec); 
  print "Thread ",number,"ends at ",ctime(); 
   
def main(): 
  seconds=[2,4]; 
  threads=[]; 
  array=range(len(seconds)); 
  for i in array : 
    t=MyThread(loop,(i,choice(seconds)),loop.__name__); 
    threads.append(t); 
  print "main Thread begins at ",ctime(); 
  for t in threads : 
    t.start(); 
  for t in threads : 
    t.join();     
  print "main Thread ends at ",ctime(); 
 
if __name__=="__main__" : 
  main(); 
  

從上面可以看出MyThread繼承了threading.Thread類,并在初始化方法中執(zhí)行了必要的參數(shù)賦值。值得注意的是在Java類的繼承中,如果不顯示的指定調(diào)用父類的構(gòu)造方法,那么默認(rèn)將調(diào)用父類的無參構(gòu)造方法。而在Python中,就不會(huì)主動(dòng)去調(diào)用。所以這里需要顯示的調(diào)用父類的初始化方法。

希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • NumPy索引與切片的用法示例總結(jié)

    NumPy索引與切片的用法示例總結(jié)

    numpy 數(shù)組索引是一個(gè)大話題,有很多種方式可以讓你選中數(shù)據(jù)的子集或某個(gè)單個(gè)元素,一維數(shù)組比較簡(jiǎn)單,看起來和 python 的列表很類似,這篇文章主要給大家介紹了關(guān)于NumPy索引與切片用法的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 詳解Python中的內(nèi)置常量的使用

    詳解Python中的內(nèi)置常量的使用

    Python作為一種功能強(qiáng)大的編程語言,提供了豐富的內(nèi)置常量來簡(jiǎn)化編程過程,本文將深入探討Python中的內(nèi)置常量,并提供豐富的示例代碼來演示其用法,希望對(duì)大家有所幫助
    2024-03-03
  • python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法

    python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法

    這篇文章主要介紹了python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • Python學(xué)習(xí)之Django的管理界面代碼示例

    Python學(xué)習(xí)之Django的管理界面代碼示例

    這篇文章主要介紹了Python學(xué)習(xí)之Django的管理界面代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • python密碼學(xué)實(shí)現(xiàn)文件加密教程

    python密碼學(xué)實(shí)現(xiàn)文件加密教程

    這篇文章主要為大家介紹了python密碼學(xué)實(shí)現(xiàn)文件加密教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用python進(jìn)行nc轉(zhuǎn)tif的3種情況解決

    使用python進(jìn)行nc轉(zhuǎn)tif的3種情況解決

    在進(jìn)行氣候分析時(shí),很多人都會(huì)用到ERA5數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于如何使用python進(jìn)行nc轉(zhuǎn)tif的3種情況的解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • python中l(wèi)ambda函數(shù)詳解及用法舉例

    python中l(wèi)ambda函數(shù)詳解及用法舉例

    這篇文章主要給大家介紹了關(guān)于python中l(wèi)ambda函數(shù)詳解及用法的相關(guān)資料,Lambda 函數(shù)是 Python中的匿名函數(shù),有些人將它們簡(jiǎn)稱為lambdas,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • python基于opencv檢測(cè)程序運(yùn)行效率

    python基于opencv檢測(cè)程序運(yùn)行效率

    這篇文章主要介紹了python基于opencv檢測(cè)程序運(yùn)行效率,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • python中matplotlib的顏色及線條控制的示例

    python中matplotlib的顏色及線條控制的示例

    這篇文章主要介紹了python中matplotlib的顏色及線條控制的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • python 讀取文本文件的行數(shù)據(jù),文件.splitlines()的方法

    python 讀取文本文件的行數(shù)據(jù),文件.splitlines()的方法

    今天小編就為大家分享一篇python 讀取文本文件的行數(shù)據(jù),文件.splitlines()的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評(píng)論

溆浦县| 海阳市| 通化县| 高唐县| 双桥区| 博兴县| 延庆县| 长顺县| 祥云县| 小金县| 德化县| 天峻县| 济阳县| 静乐县| 汉寿县| 肥乡县| 怀化市| 内丘县| 大余县| 砀山县| 新兴县| 应用必备| 礼泉县| 临清市| 靖边县| 广丰县| 江城| 洪洞县| 浙江省| 衡阳市| 工布江达县| 武山县| 肇州县| 龙岩市| 广安市| 城市| 奉贤区| 滨海县| 扎兰屯市| 合川市| 东阳市|