首頁 > 軟體

Python語法學習之執行緒的建立與常用方法詳解

2022-04-12 13:00:48

執行緒的建立與使用

在Python中有很多的多執行緒模組,其中 threading 模組就是比較常用的。下面就來看一下如何利用 threading 建立執行緒以及它的常用方法。

執行緒的建立 -threading

函數名介紹舉例
Thread建立執行緒Thread(target, args)

Thread 的動能介紹:通過呼叫 threading 模組的 Thread 類來範例化一個執行緒物件;它有兩個引數: target 與 args (與建立程序時,引數相同)。target 為建立執行緒時要執行的函數,而 args 為是要執行這個函數時需要傳入的引數。

執行緒物件的常用方法

接下里看一下執行緒物件中都有哪些常用的方法:

函數名介紹用法
start啟動執行緒start()
join阻塞執行緒直到執行緒執行結束join(timeout=None)
getName獲取執行緒的名字getName()
setName設定執行緒的名字setName(name)
is_alive判斷執行緒是否存活is_alive()
setDaemon守護執行緒setDaemon(True)
  • start 函數:啟動一個執行緒;沒有任何返回值和引數。
  • join 函數:和程序中的 join 函數一樣;阻塞當前的程式,主執行緒的任務需要等待當前子執行緒的任務結束後才可以繼續執行;引數為
  • timeout:代表阻塞的超時時間。
  • getName 函數:獲取當前執行緒的名字。
  • setName 函數:給當前的執行緒設定名字;引數為 name:是一個字串型別
  • is_alive 函數:判斷當前執行緒的狀態是否存貨
  • setDaemon 函數:它是一個守護執行緒;如果指令碼任務執行完成之後,即便程序池還沒有執行完成業務也會被強行終止。子執行緒也是如此,如果希望主程序或者是主執行緒先執行完自己的業務之後,依然允許子執行緒繼續工作而不是強行關閉它們,只需要設定 setDaemon() 為 True 就可以了。

PS:通過上面的介紹,會發現其實執行緒物件裡面的函數幾乎和程序物件中的函數非常相似,它們的使用方法和使用場景幾乎是相同的。

執行緒演示案例

單執行緒初始案例

演示 多執行緒之前 先看一下下面這個案例,執行結束後看看共計耗時多久

1、定義一個列表,裡面寫一些內容。

2、再定義一個新列表,將上一個列表的內容隨機寫入到新列表中;並且刪除上一個列表中隨機獲取到的內容。

3、這裡需要使用到 r andom 內建模組

程式碼範例如下:

# coding:utf-8


import time
import random


old_lists = ['羅馬假日', '怦然心動', '時空戀旅人', '天使愛美麗', '天使之城', '倒黴愛神', '愛樂之城']

new_lists = []


def work():
    if len(old_lists) == 0:     # 判斷 old_list 的長度,如果為0 ,則表示 該列表的內容已經被刪光了
        return ''old_list' 列表內容已經全部刪除'
    old_choice_data = random.choice(old_lists)      # random 模組的 choice函數可以隨機獲取傳入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 當獲取到這個隨機元素之後,將該元素從 old_lists 中刪除
    new_choice_data = '%s_new' % old_choice_data    # 將隨機獲取到的隨機元素通過格式化方式重新賦值,區別於之前的元素
    new_lists.append(new_choice_data)               # 將格式化的新的隨機元素新增至 new_lists 列表

    time.sleep(1)


if __name__ == '__main__':
    strat_time = time.time()

    for i in range(len(old_lists)):
        work()

    if len(old_lists) ==0:
        print(''old_lists' 當前為:{}'.format(None))
    else:
        print((''old_lists' 當前為:{}'.format(old_lists)))

    if not len(new_lists) == 0:
        print((''new_lists' 當前為:{}'.format(new_lists)))
    else:
        print(''new_lists' 當前為:{}'.format(None))

    end_time = time.time()
    print('執行結束,累計耗時:{} 秒'.format(end_time - strat_time))

執行結果如下:

從執行輸出結果我們可以看到整個指令碼執行共計耗時7秒,而且 new_lists 列表內的元素都經過格式化處理後加上了 _new ;不僅如此, 因為 random模組的choice函數 原因,new_lists 的內容順序與 old_lists 也是不一樣;每次執行順序都會不一樣,所以 old_lists 的順序是無法得到保障的。

多執行緒演示案例

程式碼範例如下:

# coding:utf-8


import time
import random
import threading


old_lists = ['羅馬假日', '怦然心動', '時空戀旅人', '天使愛美麗', '天使之城', '倒黴愛神', '愛樂之城']

new_lists = []


def work():
    if len(old_lists) == 0:     # 判斷 old_list 的長度,如果為0 ,則表示 該列表的內容已經被刪光了
        return ''old_list' 列表內容已經全部刪除'
    old_choice_data = random.choice(old_lists)      # random 模組的 choice函數可以隨機獲取傳入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 當獲取到這個隨機元素之後,將該元素從 old_lists 中刪除
    new_choice_data = '%s_new' % old_choice_data    # 將隨機獲取到的隨機元素通過格式化方式重新賦值,區別於之前的元素
    new_lists.append(new_choice_data)               # 將格式化的新的隨機元素新增至 new_lists 列表

    time.sleep(1)


if __name__ == '__main__':
    strat_time = time.time()

    print(''old_lists'初始長度為:{}'.format(len(old_lists)))	# 獲取 old_lists 與 new_lists 最初始的長度
    print(''new_lists'初始長度為:{}'.format(len(new_lists)))
    thread_list = []        # 定義一個空的 thread_list 物件,用以下方新增每個執行緒

    for i in range(len(old_lists)):
        thread_work = threading.Thread(target=work)     # 定義一個執行緒範例化物件執行 work 函數,因為 work 函數沒有引數所以不用傳 args
        thread_list.append(thread_work)                 # 將 thread_work 新增進 thread_list
        thread_work.start()                             # 啟動每一個執行緒

    for t in thread_list:   # 通過for迴圈將每一個執行緒進行阻塞
        t.join()

    if len(old_lists) ==0:
        print(''old_lists' 當前為:{}'.format(None), '當前長度為:{}'.format(len(old_lists)))
    else:
        print((''old_lists' 當前為:{}'.format(old_lists)))

    if not len(new_lists) == 0:
        print(''new_lists' 當前長度為:{}'.format(len(new_lists)))
        print(''new_lists' 當前的值為:{}'.format(new_lists))
    else:
        print(''new_lists' 當前為:{}'.format(None))

    end_time = time.time()
    print('執行結束,累計耗時:{} 秒'.format(end_time - strat_time))

執行結果如下:

從執行的結果來看,我們初始的單執行緒任務耗時為 7秒,在使用多執行緒之後,僅耗時 1秒就完成了,大大的提高了我們的執行效率。

執行緒的問題

通過上面的練習,我們發現程序的使用方法幾乎與程序是一模一樣的。它們都可以互不干擾的執行程式,也可以使得主執行緒的程式不需要等待子執行緒的任務完成之後再去執行。只不過剛剛的演示案例中我們使用了 join() 函數進行了阻塞,這裡可以吧 join() 去掉,看看執行效果。

與程序一樣,執行緒也存在著一定的問題。

執行緒執行的函數,也同樣是無法獲取返回值的。

當多個執行緒同時修改檔案一樣會造成被修改檔案的資料錯亂的錯誤(因為都是並行去操作一個檔案,特別是在處理交易場景的時候,需要尤為注意)。

到此這篇關於Python語法學習之執行緒的建立與常用方法詳解的文章就介紹到這了,更多相關Python 執行緒建立內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com