日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python?threading和Thread模塊及線程的實現(xiàn)_python

作者:??孤寒者???? ? 更新時間: 2022-08-04 編程語言

前言

  • 進程: 打開一個程序至少會有一個進程 ?它是cpu調度的最小的單位。
  • 線程: 程序執(zhí)行的最小單位,一個進程里面至少有一個線程,cpu會控制進程里面的線程。

打個比方:

  • (1)打開一個qq就是一個進程的話,那么你可以同時和好多人聊天,和一個人聊天這就是一個線程。
  • (2)再打個比方,一條直行的高速公路,分好幾個車道,這整個告訴公路就相當于一個進程,那些車道就相當于一個個線程,如果有一條車道上的車拐彎,別的車道的車就要等待,不然就撞車了。

注意:

  • (1)一個cpu同一時間只能處理一件事,如果同時有多個任務,那么就輪換著執(zhí)行,但是每個任務執(zhí)行的時間非常短暫,無法感受到。
  • (2)使用線程的時候,不管它的順序,因為cpu是隨機調度的。
  • (3)一個程序的執(zhí)行,就會有一個主線程

1. 線程

1.1 線程模塊

  • Python通過兩個標準庫thread 和threading提供對線程的支持 , threading對thread進行了封裝。threading模塊中提供了Thread , Lock , RLock , Condition等組件。
  • 因此在實際的使用中我們一般都是使用threading。

1.1.1 Thread類

常用參數(shù)說明:

  • target:表示調用對象,即子線程要執(zhí)行的任務。
  • name:子線程的名稱。
  • args:傳入target函數(shù)中的位置參數(shù),是一個元組,必須加逗號。

常用實例方法:

  • Thread.run(self)

線程啟動時運行的方法,由該方法調用target參數(shù)所指定的函數(shù)。

  • Thread.start(self)

啟動線程,start方法就是去幫你調用run方法。

  • Thread.terminate(self)

強制終止線程。

  • Thread.join(self, timeout=None)

阻塞調用,主線程進行等待。

  • Thread.setDaemon(self, daemonic)

將子線程設置為守護線程。

  • Thread.getName(self, name)

獲取線程名稱。

  • Thread.setName(self, name)

設置線程名稱:

但是剛剛也講了實際使用中我們都是使用的threading模塊,所以此處只是簡單介紹一下Thread類,下面講解都是使用的threading模塊!

1.2 創(chuàng)建線程

在python中創(chuàng)建線程有兩種方式:

  • 實例Thread類;
  • 繼承重寫Thread類。

1.2.1 實例Thread類法創(chuàng)建線程

(需要注意的是:下面在主線程里添加了t1,t2兩個子線程,①如果沒有設置setDaemon守護線程,那么整個文件順序執(zhí)行完[即主線程]之后,對應的兩個子線程并行執(zhí)行;②如果設置了守護線程,那么對應的設置了守護線程的子線程在主線程執(zhí)行完之后立馬被殺死?。?/p>

# -*- coding: utf-8 -*-
import threading
import time

# 定義線程要運行的函數(shù)
def sing():
    # 為了便于觀察,sleep1秒
    for i in range(5):
        print("正在唱歌......")
        time.sleep(1)

def dance():
    # 為了便于觀察,sleep1秒
    for i in range(5):
        print("正在跳舞......")
        time.sleep(1)


if __name__ == '__main__':
    # 創(chuàng)建兩個線程實例
    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)
    # 設置守護線程
    t1.setDaemon(True)    # 守護線程:把子線程作為主線程的守護線程
    t2.setDaemon(True)
    # 啟動線程
    t1.start()
    t2.start()
    print('主線程結束')

未設置t1,t2為守護線程時的輸出:

設置t1,t2為守護線程時的輸出:

1.2.1 繼承重寫Thread類法創(chuàng)建線程

# -*- coding: utf-8 -*-
import threading
import time

# 繼承threading中的Thread類
class MyThread(threading.Thread):
    # 線程中所需要的參數(shù)
    def __init__(self, name):
        super().__init__()
        self.name = name
    # 重構run方法,注意這個是表示線程活動的方法,必須有!
    def run(self):
        print('I am %s' % self.name)
        time.sleep(2)

# 創(chuàng)建線程實例
t1 = MyThread('guhanzhe')
t2 = MyThread('coolboy')
# 啟動線程
t1.start()
t2.start()
# 打印線程名
print(t1.getName())
print(t2.getName())

1.3 Join & setDaemon

在說這兩個方法之前 , 需要知道主線程與子線程的概念:

  • 主線程 : 當一個程序啟動時 , 就有一個線程開始運行 , 該線程通常叫做程序的主線程。
  • 子線程 : 因為程序是開始時就執(zhí)行的 , 如果你需要再創(chuàng)建線程 , 那么創(chuàng)建的線程就是這個主線程的子線程。

主線程的重要性體現(xiàn)在兩方面 :

  • 是產生其他子線程的線程;
  • 通常它必須最后完成執(zhí)行比如執(zhí)行各種關閉操作。

1.3.1 join

  • join : 阻塞調用程序 , 直到調用join () 方法的線程執(zhí)行結束, 才會繼續(xù)往下執(zhí)行。
# -*- coding: utf-8 -*-
import threading
import time

def run(name):
    print('I am %s' % name)
    time.sleep(2)
    print('子線程結束......')

t1 = threading.Thread(target=run, args=('guhanzhe', ))
t1.start()
# 阻塞主線程,等待子線程運行結束
t1.join()
print('主線程結束......')

大家可以嘗試不加join()的話輸出是什么樣的哦~

1.3.2 setDaemon

  • setDaemon() 與 join() 基本上是相對的 , join會等子線程執(zhí)行完畢 ; 而setDaemon則不會等,主線程結束,對應的設置了守護線程的子線程也會立馬被殺死。
# -*- coding: utf-8 -*-
import threading
import time

def run(name):
    print('I am %s' % name)
    time.sleep(2)
    print('子線程結束......')

t1 = threading.Thread(target=run, args=('guhanzhe', ))
# 設置守護線程
t1.setDaemon(True)
t1.start()
print('主線程結束......')

原文鏈接:https://juejin.cn/post/7107598958507065352

欄目分類
最近更新