標籤: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的線程