首頁  >  文章  >  後端開發  >  Python執行緒的創建與常用方法(實例詳解)

Python執行緒的創建與常用方法(實例詳解)

WBOY
WBOY轉載
2022-05-06 18:41:183451瀏覽

本篇文章為大家帶來了關於python的相關知識,其中主要介紹了關於線程的創建與常用的方法,還有一些線程演示案例,下面一起來看一下,希望對大家有幫助。

Python執行緒的創建與常用方法(實例詳解)

推薦學習:python影片教學

#執行緒的建立與使用

在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-8import timeimport 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))

運行結果如下:


Python執行緒的創建與常用方法(實例詳解)

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


多執行緒示範案例

程式碼範例如下:

# coding:utf-8import timeimport randomimport 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))

執行結果如下:


Python執行緒的創建與常用方法(實例詳解)

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


 執行緒的問題

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

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

  • 執行緒執行的函數,也同樣是無法取得回傳值的。
  • 當多個執行緒同時修改文件一樣會造成被修改文件的資料錯亂的錯誤(因為都是並發去操作一個文件,特別是在處理交易場景的時候,需要特別注意)。

關於這些執行緒中存在的問題同樣是可以解決的,在下一章節的 執行緒池與全域鎖定 我們會有詳細的介紹。

推薦學習:python影片教學

#

以上是Python執行緒的創建與常用方法(實例詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除