您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“python中線程的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“python中線程的示例分析”這篇文章吧。
Python中創建線程有兩種方式:函數或者用類來創建線程對象。
函數式:調用 _thread 模塊中的start_new_thread()函數來產生新線程。
類:創建threading.Thread的子類來包裝一個線程對象。
1.線程的創建
1.1 通過thread類直接創建
import threading import time def foo(n): time.sleep(n) print("foo func:",n) def bar(n): time.sleep(n) print("bar func:",n) s1=time.time() #創建一個線程實例t1,foo為這個線程要運行的函數 t1=threading.Thread(target=foo,args=(3,)) t1.start() #啟動線程t1 #創建一個線程實例t2,bar為這個線程要運行的函數 t2=threading.Thread(target=bar,args=(5,)) t2.start() #啟動線程t2 print("ending") s2=time.time() print("cost time:",s2-s1)
在這段程序里,一個函數會先休眠幾秒鐘,然后再打印一句話,第二個函數也是先休眠幾秒鐘,然后打印一句話。
接著程序會實例化兩個線程,并調用兩個函數來執行,最后會打印程序問總共執行了多少時間
程序運行結果如下:
ending cost time: 0.002000093460083008 foo func: 3 bar func: 5
程序會先運行父線程,打印"ending",然后打印程序執行父線程的時間,最后才會運行子線程
1.2 通過thread類來繼承式創建
import threading import time # 定義MyThread類,其繼承自threading.Thread這個父類 class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): print("ok") time.sleep(2) print("end t1") # 對類進行實例化 t1=MyThread() # 啟動線程 t1.start() print("ending")
2. Thread類的一些常用方法
2.1 join():在子線程完成之前,主線程將一直被阻塞****
線程的join方法必須在子線程的start方法之后定義
在第一個例子中加入兩行代碼,如下:
import threading import time def foo(n): time.sleep(n) print("foo func:",n) def bar(n): time.sleep(n) print("bar func:",n) s1=time.time() t1=threading.Thread(target=foo,args=(3,)) t1.start() t2=threading.Thread(target=bar,args=(5,)) t2.start() t1.join() # 阻塞t1線程 t2.join() # 阻塞t2線程 print("ending") s2=time.time() print("cost time:",s2-s1)
再次執行程序,運行結果如下:
foo func: 3 bar func: 5 ending cost time: 5.002285957336426
程序運行到子線程t1中的foo方法時會睡眠3秒鐘,與此同時,子線程t2也在睡眠
等到子線程t1睡眠完成后,開始打印foo函數中的print語句,然后子線程t1執行完成
2秒鐘之后,子線程t2睡眠完成,開始打印bar函數中的print語句,然后子線程t2也執行完成。
而在這之前,主線程一直處于阻塞狀態。等到子線程執行完成之后主線程才會執行
2.2 setDeamon(True)
setDaemon方法作用是將進程聲明為守護線程,必須在`start()`方法調用之前,
如果不設置為守護線程,程序會被無限掛起
在程序執行過程中,執行一個主線程,主線程又創建一個子線程時,主線程和子線程會分別運行。
當主線程運行完成時,會檢驗子線程是否執行完成,如果子線程執行完成,則主線程會等待子線程完成后再退出。
但是有的時候只要主線程執行完成之后,不管子線程是否執行完成,都和主線程一起退出,這個就需要調用setDeamon方法了。
拿第一個例子來說吧,現在我想讓子線程t1和t2隨同主線程關閉,代碼如下:
import threading import time def foo(n): print("foo start") time.sleep(n) print("foo end...") def bar(n): print("bar start") time.sleep(n) print("bar end...") s1 = time.time() t1 = threading.Thread(target=foo, args=(3,)) t1.setDaemon(True) t1.start() t2 = threading.Thread(target=bar, args=(5,)) t2.setDaemon(True) t2.start() print("ending") s2 = time.time() print("cost time:", s2 - s1)
程序運行結果如下 :
foo start bar start ending cost time: 0.003000020980834961
可以看到,把t1和t2都聲明為守護線程后,程序自上而下執行,先執行子線程t1中的foo方法,打印foo函數中的第一條打印語句,然后子線程t1進入到睡眠狀態。
然后子線程t2執行,打印bar函數中的第一條print語句,然后子線程t2進入睡眠狀態,程序切換到主線程運行
主線程打印完"ending"語句,發現子線程t1和t2已經被設置為守護線程,所以主線程不需要再等待兩個子線程執行完成,而是立即結束,打印整個程序的執行時間。
整個程序就跟隨主線程一起關閉了。
2.3 子線程的一些其他方法
isAlive() #判斷一個線程是否是活動線程 getName() #返回線程的名字 setName() #設置線程的名字 import threading import time def foo(n): time.sleep(n) print("foo func:", n) def bar(n): time.sleep(n) print("bar func:", n) s1 = time.time() t1 = threading.Thread(target=foo, args=(3,)) t1.setDaemon(True) print("線程還未啟動時,判斷t1是否是活動的線程:", t1.isAlive()) # 線程還未啟動,所以是False t1.start() # 啟動線程 print("線程已啟動時,判斷t1是否是活動的線程:", t1.isAlive()) # 線程已啟動,所以是True print("修改前的線程名為:",t1.getName()) # 獲取線程名 t1.setName("t1") #設置線程名 print("修改后的線程名為:",t1.getName()) # 獲取線程名 t1.join() print("線程執行完成時,判斷t1是不否是活動的線程:", t1.isAlive()) # 線程已執行完成,所以是False # print(threading.activeCount()) print("ending") s2 = time.time() print("cost time:", s2 - s1)
程序執行結果:
線程還未啟動時,判斷t1是否是活動的線程: False
線程已啟動時,判斷t1是否是活動的線程: True
修改前的線程名為: Thread-1
修改后的線程名為: t1
foo func: 3
線程執行完成時,判斷t1是不否是活動的線程: False
ending
cost time: 3.001171588897705
3.threading模塊提供的一些方法
threading.currentThread() #返回當前的線程變量 threading.enumerate() #返回一個包含正在運行的線程的列表,不包括啟動前和終止后的線程 threading.activeCount() #返回正在運行的線程數量,等同于len(threading.enumerate()) import threading import time def foo(n): time.sleep(n) print("foo func:", n) def bar(n): time.sleep(n) print("bar func:", n) s1 = time.time() t1 = threading.Thread(target=foo, args=(3,)) t1.setDaemon(True) t1.start() t2 = threading.Thread(target=bar, args=(5,)) t2.setDaemon(True) t2.start() print("程序中正在運行的線程數量:",threading.activeCount()) print("程序中當前的線程變量:",threading.currentThread()) print("當前正在運行的線程的列表:",threading.enumerate()) print("ending") s2 = time.time() print("cost time:", s2 - s1)
程序執行結果:
程序中正在運行的線程數量: 3
程序中當前的線程變量: <_MainThread(MainThread, started 7064)>
當前正在運行的線程的列表: [<_MainThread(MainThread, started 7064)>, <Thread(Thread-1, started daemon 6384)>, <Thread(Thread-2, started daemon 2640)>]
ending
cost time: 0.002000093460083008
以上是“python中線程的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。