三十五、python的線程

來源:互聯網
上載者:User

標籤:strong   star   程式   setname   運行   完成後   start   啟動   大量   

python中,每個進程有GIL鎖,導致每個進程同一時刻只能有一個線程出來執行

 

threading模組

import threadingimport timedef foo(x):    print("--------%s" %x)    time.sleep(3)t1=threading.Thread(target=foo,args=(2,))   #建立線程對象; 任務,參數,元組形式t1.start()  # 啟動print("ending")

  

join

阻塞主線程,等待線程結束後再繼續執行主線程

import threadingimport timedef foo(x):    print("--------%s" %x)    time.sleep(3)def bar(n):    print("--------%s" %n)    time.sleep(5)s = time.time()t1=threading.Thread(target=foo,args=(2,))   #建立線程對象; 任務,參數,元組形式t1.start()  # 啟動t2=threading.Thread(target=bar,args=(5,))   #建立線程對象; 任務,參數,元組形式t2.start()  # 啟動t1.join()t2.join()print("ending")print(time.time() - s)# --------2# --------5# ending# 5.001526832580566

不開多線程的已耗用時間

import threadingimport timedef foo(x):    print("--------%s" %x)    time.sleep(3)def bar(n):    print("--------%s" %n)    time.sleep(5)s = time.time()foo(2)bar(5)print("ending")print(time.time() - s)# --------2# --------5# ending# 8.000638246536255

 

setDaemon(True) 守護線程

  將線程聲明為守護線程,必須在start()
  方法調用之前設定,如果不設定為守護線程程式會被無限掛起。
  當我們在程式運行中,執行一個主線程,如果主線程又建立一個子線程,主線程和子線程
  就分兵兩路,分別運行,那麼當主線程完成
  想退出時,會檢驗子線程是否完成。如果子線程未完成,則主線程會等待子線程完成後再退出。但是有時候我們需要的是只要主線程
  完成了,不管子線程是否完成,都要和主線程一起退出,這時就可以
  用setDaemon方法啦

  當daemon設定為true時,如果主線程退出,那麼子線程也將跟著退出,反之,子線程將繼續運行,直到正常退出
  

 

import threadingimport timedef foo(x):    time.sleep(3)    print("--------%s" % x)def bar(n):    time.sleep(5)    print("--------%s" % n)s = time.time()t1=threading.Thread(target=foo,args=(2,))   #建立線程對象; 任務,參數,元組形式# t1.setDaemon(True)t1.start()  # 啟動t2=threading.Thread(target=bar,args=(5,))   #建立線程對象; 任務,參數,元組形式t2.setDaemon(True)t2.start()  # 啟動print("ending")print(time.time() - s)# ending# 0.0010097026824951172# --------2

  

Thread執行個體對象的方法  # isAlive(): 返回線程是否活動的。  # getName(): 返回線程名。  # setName(): 設定線程名。threading模組提供的一些方法:  # threading.currentThread(): 返回當前的線程變數。  # threading.enumerate(): 返回一個包含正在啟動並執行線程的list。正在運行指線程啟動後、結束前,不包括啟動前和終止後的線程。  # threading.activeCount(): 返回正在啟動並執行線程數量,與len(threading.enumerate())有相同的結果。

  

==================

計算密集型和IO密集型

  IO密集:

    程式中存在大量的IO操作

  計算密集:

    程式中存在大量計算操作(非IO操作)

 

對於計算密集型,多線程還不如順序執行;GIL鎖只能出來一個線程,多個線程只能切換執行,這樣對於計算密集型效率就會變低

對於IO密集型,對於IO阻塞時,切換執行其他線程,這樣就節省了阻塞的時間,效率就會高

 

結論:對於python而言,同一進程下,無法利用多核優勢,多執行緒IO密集型任務時,具有優勢,對於處理計算密集型的任務,不推薦使用

 

三十五、python的線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.