91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中線程的示例分析

發布時間:2021-08-03 12:30:03 來源:億速云 閱讀:103 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“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中線程的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会泽县| 东兴市| 秭归县| 静乐县| 安陆市| 东阳市| 东丽区| 萨迦县| 寻乌县| 靖州| 萍乡市| 台中县| 湖南省| 牙克石市| 岚皋县| 舒兰市| 沙坪坝区| 抚顺市| 雅安市| 库车县| 勃利县| 卫辉市| 嘉祥县| 静乐县| 南皮县| 通州区| 泾源县| 黑山县| 潜山县| 靖州| 惠东县| 德阳市| 当涂县| 延吉市| 永吉县| 河东区| 桃江县| 抚顺县| 延安市| 哈尔滨市| 靖远县|