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)在這段程序里,一個函數會先休眠幾秒鐘,然后再打印一句話,第二個函數也是先休眠幾秒鐘,然后打印一句話。
接著程序會實例化兩個線程,并調用兩個函數來執行,最后會打印程序問總共執行了多少時間
程序運行結果如下:
endingcost time: 0.002000093460083008foo func: 3bar 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: 3bar func: 5endingcost time: 5.002285957336426
程序運行到子線程t1中的foo方法時會睡眠3秒鐘,與此同時,子線程t2也在睡眠
等到子線程t1睡眠完成后,開始打印foo函數中的print語句,然后子線程t1執行完成
2秒鐘之后,子線程t2睡眠完成,開始打印bar函數中的print語句,然后子線程t2也執行完成。
而在這之前,主線程一直處于阻塞狀態。等到子線程執行完成之后主線程才會執行
新聞熱點
疑難解答