国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解python中的線程

2020-01-04 15:53:20
字體:
來源:轉載
供稿:網友

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也執行完成。

而在這之前,主線程一直處于阻塞狀態。等到子線程執行完成之后主線程才會執行

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 startbar startendingcost 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中的線程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中宁县| 张掖市| 游戏| 大厂| 长岭县| 曲松县| 西乡县| 靖江市| 水城县| 阳江市| 嘉黎县| 镇安县| 南澳县| 潍坊市| 文水县| 大名县| 茂名市| 衢州市| 泰州市| 石屏县| 丰城市| 宜州市| 休宁县| 江津市| 基隆市| 全椒县| 乌拉特前旗| 卓资县| 东辽县| 固阳县| 天水市| 霸州市| 南和县| 乡宁县| 台南县| 昌图县| 六枝特区| 大城县| 闵行区| 平远县| 泸水县|