溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python線程的創(chuàng)建與常用方法是什么

發(fā)布時(shí)間:2022-05-10 15:49:20 來(lái)源:億速云 閱讀:166 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“Python線程的創(chuàng)建與常用方法是什么”,在日常操作中,相信很多人在Python線程的創(chuàng)建與常用方法是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python線程的創(chuàng)建與常用方法是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Python線程的創(chuàng)建與常用方法是什么

線程的創(chuàng)建與使用

在Python中有很多的多線程模塊,其中 threading 模塊就是比較常用的。下面就來(lái)看一下如何利用 threading 創(chuàng)建線程以及它的常用方法。

線程的創(chuàng)建 -threading

函數(shù)名介紹舉例
Thread創(chuàng)建線程Thread(target, args)

Thread 的動(dòng)能介紹:通過(guò)調(diào)用 threading 模塊的 Thread 類來(lái)實(shí)例化一個(gè)線程對(duì)象;它有兩個(gè)參數(shù): target 與 args (與創(chuàng)建進(jìn)程時(shí),參數(shù)相同)。target 為創(chuàng)建線程時(shí)要執(zhí)行的函數(shù),而 args 為是要執(zhí)行這個(gè)函數(shù)時(shí)需要傳入的參數(shù)。

線程對(duì)象的常用方法

接下里看一下線程對(duì)象中都有哪些常用的方法:

函數(shù)名介紹用法
start啟動(dòng)線程start()
join阻塞線程直到線程執(zhí)行結(jié)束join(timeout=None)
getName獲取線程的名字getName()
setName設(shè)置線程的名字setName(name)
is_alive判斷線程是否存活is_alive()
setDaemon守護(hù)線程setDaemon(True)
  • start 函數(shù):?jiǎn)?dòng)一個(gè)線程;沒(méi)有任何返回值和參數(shù)。

  • join 函數(shù):和進(jìn)程中的 join 函數(shù)一樣;阻塞當(dāng)前的程序,主線程的任務(wù)需要等待當(dāng)前子線程的任務(wù)結(jié)束后才可以繼續(xù)執(zhí)行;參數(shù)為 timeout:代表阻塞的超時(shí)時(shí)間。

  • getName 函數(shù):獲取當(dāng)前線程的名字。

  • setName 函數(shù):給當(dāng)前的線程設(shè)置名字;參數(shù)為 name:是一個(gè)字符串類型

  • is_alive 函數(shù):判斷當(dāng)前線程的狀態(tài)是否存貨

  • setDaemon 函數(shù):它是一個(gè)守護(hù)線程;如果腳本任務(wù)執(zhí)行完成之后,即便進(jìn)程池還沒(méi)有執(zhí)行完成業(yè)務(wù)也會(huì)被強(qiáng)行終止。子線程也是如此,如果希望主進(jìn)程或者是主線程先執(zhí)行完自己的業(yè)務(wù)之后,依然允許子線程繼續(xù)工作而不是強(qiáng)行關(guān)閉它們,只需要設(shè)置 setDaemon() True 就可以了。

PS:通過(guò)上面的介紹,會(huì)發(fā)現(xiàn)其實(shí)線程對(duì)象里面的函數(shù)幾乎和進(jìn)程對(duì)象中的函數(shù)非常相似,它們的使用方法和使用場(chǎng)景幾乎是相同的。

線程演示案例

單線程初始案例

演示 多線程之前 先看一下下面這個(gè)案例,運(yùn)行結(jié)束后看看共計(jì)耗時(shí)多久

1、定義一個(gè)列表,里面寫一些內(nèi)容。

2、再定義一個(gè)新列表,將上一個(gè)列表的內(nèi)容隨機(jī)寫入到新列表中;并且刪除上一個(gè)列表中隨機(jī)獲取到的內(nèi)容。

3、這里需要使用到 r andom 內(nèi)置模塊

代碼示例如下:

# coding:utf-8import timeimport random


old_lists = ['羅馬假日', '怦然心動(dòng)', '時(shí)空戀旅人', '天使愛(ài)美麗', '天使之城', '倒霉愛(ài)神', '愛(ài)樂(lè)之城']new_lists = []def work():
    if len(old_lists) == 0:     # 判斷 old_list 的長(zhǎng)度,如果為0 ,則表示 該列表的內(nèi)容已經(jīng)被刪光了
        return '\'old_list\' 列表內(nèi)容已經(jīng)全部刪除'
    old_choice_data = random.choice(old_lists)      # random 模塊的 choice函數(shù)可以隨機(jī)獲取傳入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 當(dāng)獲取到這個(gè)隨機(jī)元素之后,將該元素從 old_lists 中刪除
    new_choice_data = '%s_new' % old_choice_data    # 將隨機(jī)獲取到的隨機(jī)元素通過(guò)格式化方式重新賦值,區(qū)別于之前的元素
    new_lists.append(new_choice_data)               # 將格式化的新的隨機(jī)元素添加至 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\' 當(dāng)前為:{}'.format(None))
    else:
        print(('\'old_lists\' 當(dāng)前為:{}'.format(old_lists)))

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

    end_time = time.time()
    print('運(yùn)行結(jié)束,累計(jì)耗時(shí):{} 秒'.format(end_time - strat_time))

運(yùn)行結(jié)果如下:


Python線程的創(chuàng)建與常用方法是什么

從運(yùn)行輸出結(jié)果我們可以看到整個(gè)腳本運(yùn)行共計(jì)耗時(shí)7秒,而且 new_lists 列表內(nèi)的元素都經(jīng)過(guò)格式化處理后加上了 _new ;不僅如此, 因?yàn)?random模塊的choice函數(shù) 原因,new_lists 的內(nèi)容順序與 old_lists 也是不一樣;每次運(yùn)行順序都會(huì)不一樣,所以 old_lists 的順序是無(wú)法得到保障的。


多線程演示案例

代碼示例如下:

# coding:utf-8import timeimport randomimport threading


old_lists = ['羅馬假日', '怦然心動(dòng)', '時(shí)空戀旅人', '天使愛(ài)美麗', '天使之城', '倒霉愛(ài)神', '愛(ài)樂(lè)之城']new_lists = []def work():
    if len(old_lists) == 0:     # 判斷 old_list 的長(zhǎng)度,如果為0 ,則表示 該列表的內(nèi)容已經(jīng)被刪光了
        return '\'old_list\' 列表內(nèi)容已經(jīng)全部刪除'
    old_choice_data = random.choice(old_lists)      # random 模塊的 choice函數(shù)可以隨機(jī)獲取傳入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 當(dāng)獲取到這個(gè)隨機(jī)元素之后,將該元素從 old_lists 中刪除
    new_choice_data = '%s_new' % old_choice_data    # 將隨機(jī)獲取到的隨機(jī)元素通過(guò)格式化方式重新賦值,區(qū)別于之前的元素
    new_lists.append(new_choice_data)               # 將格式化的新的隨機(jī)元素添加至 new_lists 列表

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

    print('\'old_lists\'初始長(zhǎng)度為:{}'.format(len(old_lists)))	# 獲取 old_lists 與 new_lists 最初始的長(zhǎng)度
    print('\'new_lists\'初始長(zhǎng)度為:{}'.format(len(new_lists)))
    thread_list = []        # 定義一個(gè)空的 thread_list 對(duì)象,用以下方添加每個(gè)線程

    for i in range(len(old_lists)):
        thread_work = threading.Thread(target=work)     # 定義一個(gè)線程實(shí)例化對(duì)象執(zhí)行 work 函數(shù),因?yàn)?nbsp;work 函數(shù)沒(méi)有參數(shù)所以不用傳 args
        thread_list.append(thread_work)                 # 將 thread_work 添加進(jìn) thread_list
        thread_work.start()                             # 啟動(dòng)每一個(gè)線程

    for t in thread_list:   # 通過(guò)for循環(huán)將每一個(gè)線程進(jìn)行阻塞
        t.join()

    if len(old_lists) ==0:
        print('\'old_lists\' 當(dāng)前為:{}'.format(None), '當(dāng)前長(zhǎng)度為:{}'.format(len(old_lists)))
    else:
        print(('\'old_lists\' 當(dāng)前為:{}'.format(old_lists)))

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

    end_time = time.time()
    print('運(yùn)行結(jié)束,累計(jì)耗時(shí):{} 秒'.format(end_time - strat_time))

運(yùn)行結(jié)果如下:


Python線程的創(chuàng)建與常用方法是什么

從運(yùn)行的結(jié)果來(lái)看,我們初始的單線程任務(wù)耗時(shí)為 7秒,在使用多線程之后,僅耗時(shí) 1秒就完成了,大大的提高了我們的運(yùn)行效率。


線程的問(wèn)題

通過(guò)上面的練習(xí),我們發(fā)現(xiàn)線程的使用方法幾乎與進(jìn)程是一模一樣的。它們都可以互不干擾的執(zhí)行程序,也可以使得主線程的程序不需要等待子線程的任務(wù)完成之后再去執(zhí)行。只不過(guò)剛剛的演示案例中我們使用了 join() 函數(shù)進(jìn)行了阻塞,這里可以吧 join() 去掉,看看執(zhí)行效果。

與進(jìn)程一樣,線程也存在著一定的問(wèn)題。

  • 線程執(zhí)行的函數(shù),也同樣是無(wú)法獲取返回值的。

  • 當(dāng)多個(gè)線程同時(shí)修改文件一樣會(huì)造成被修改文件的數(shù)據(jù)錯(cuò)亂的錯(cuò)誤(因?yàn)槎际遣l(fā)去操作一個(gè)文件,特別是在處理交易場(chǎng)景的時(shí)候,需要尤為注意)。

到此,關(guān)于“Python線程的創(chuàng)建與常用方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI