Python中多線程的建立及基本調用方法

來源:互聯網
上載者:User
1. 多線程的作用
簡而言之,多線程是平行處理相互獨立的子任務,從而大幅度提高整個任務的效率。

2. Python中的多線程相關模組和方法
Python中提供幾個用於多線程編程的模組,包括thread,threading和Queue等
thread模組提供了基本的線程和鎖的支援,除產生線程外,也提供基本的同步資料結構鎖對象,其中包括:
start_new_thread(function, args kwargs=None) 產生一個新的線程來運行給定函數
allocate_lock() 分配一個LockType類型的鎖對象
exit() 讓線程退出
acquire(wait=None) 嘗試擷取鎖對象
locked() 如果擷取了鎖對象返回TRUE,否則返回FALSE
release() 釋放鎖
threading提供了更進階別,功能更強的線程管理功能
Thread類 表示一個線程的執行的對象
Lock 鎖原語對象
RLock 可重新進入鎖對象,使單線程可以再次獲得已經擷取鎖
queue模組允許使用者建立一個可以用於多個線程之間共用資料的隊列資料結構
可用於進程間的通訊,讓各個線程之間共用資料
模組函數queue(size) 建立一個大小為size的Queue對象
queue對象函數 qsize() 返回隊列大小
empty() 隊列為空白返回True,否則返回False
put(item, block=0) 把ITEM放到隊列中,block不為0,函數會一直阻塞到隊列中
get(block=0) 從隊列中取一個對象,若果給block,函數會一直阻塞到隊列中有對象為止

3.樣本
目前Python的lib中對多線程編程提供兩種啟動方法,一種是比較基本的thread模組中start_new_thread方法,線上程中運行一個函數, 另一種是使用整合threading模組的線程對象Thread類。
目前所用到的,是舊版本中調用thread模組中的start_new_thread()函數來產生新的線程
相比而言,thread.start_new_thread(function,(args[,kwargs]))實現機制其實與C更為類似,其中function參數是將要調用的線程函數;(args[,kwargs])是將傳遞給待建立線程函數的參數組成的元群組類型,其中kwargs是可選的參數。新建立的線程結束一般依靠線程函數的執行結束自動結束,或者線上程函數中調用thread.exit()拋出SystemExit exception,達到線程退出的目的。

print "=======================thread.start_new_thread啟動線程============="  import thread  #Python的線程sleep方法並不是在thread模組中,反而是在time模組下  import time  def inthread(no,interval):    count=0    while count<10:      print "Thread-%d,休眠間隔:%d,current Time:%s"%(no,interval,time.ctime())      #使當前線程休眠指定時間,interval為浮點型的秒數,不同於Java中的整形毫秒數      time.sleep(interval)      #Python不像大多數進階語言一樣支援++操作符,只能用+=實現      count+=1    else:      print "Thread-%d is over"%no      #可以等待線程被PVM回收,或主動調用exit或exit_thread方法結束線程      thread.exit_thread()  #使用start_new_thread函數可以簡單的啟動一個線程,第一個參數指定線程中執行的函數,第二個參數為元組型的傳遞給指定函數的參數值  thread.start_new_thread(inthread,(1,2))    #線程執行時必須添加這一行,並且sleep的時間必須足夠使線程結束,如本例    #如果休眠時間改為20,將可能會拋出異常  time.sleep(30)  '''  

使用這種方法啟動線程時,有可能出現異常

Unhandled exception in thread started by Error in sys.excepthook: Original exception was: 

解決:啟動線程之後,須確保主線程等待所有子線程返回結果後再退出,如果主線程比子線程早結束,無論其子線程是否是後台線程,都將會中斷,拋出這個異常
若沒有響應阻塞等待,為避免主線程提前退出,必須調用time.sleep使主線程休眠足夠長的時間,另外也可以採用加鎖機制來避免類似情況,通過在啟動線程的時候,給每個線程都加了一把鎖,直到線程運行介紹,再釋放這個鎖。同時在Python的main線程中用一個while迴圈來不停的判斷每個線程鎖已釋放。

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();  

很多介紹說在新python版本中推薦使用Threading模組,目前暫沒有應用到。。。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.