久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      Python線程的創(chuàng)建與常用方法(實(shí)例詳解)

      本篇文章給大家?guī)砹岁P(guān)于python的相關(guān)知識,其中主要介紹了關(guān)于線程的創(chuàng)建與常用的方法,還有一些線程演示案例,下面一起來看一下,希望對大家有幫助。

      Python線程的創(chuàng)建與常用方法(實(shí)例詳解)

      推薦學(xué)習(xí):python視頻教程

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

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

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

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

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

      線程對象的常用方法

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

      函數(shù)名 介紹 用法
      start 啟動線程 start()
      join 阻塞線程直到線程執(zhí)行結(jié)束 join(timeout=None)
      getName 獲取線程的名字 getName()
      setName 設(shè)置線程的名字 setName(name)
      is_alive 判斷線程是否存活 is_alive()
      setDaemon 守護(hù)線程 setDaemon(True)
      • start 函數(shù):啟動一個線程;沒有任何返回值和參數(shù)。
      • join 函數(shù):和進(jìn)程中的 join 函數(shù)一樣;阻塞當(dāng)前的程序,主線程的任務(wù)需要等待當(dāng)前子線程的任務(wù)結(jié)束后才可以繼續(xù)執(zhí)行;參數(shù)為 timeout:代表阻塞的超時時間。
      • getName 函數(shù):獲取當(dāng)前線程的名字。
      • setName 函數(shù):給當(dāng)前的線程設(shè)置名字;參數(shù)為 name:是一個字符串類型
      • is_alive 函數(shù):判斷當(dāng)前線程的狀態(tài)是否存貨
      • setDaemon 函數(shù):它是一個守護(hù)線程;如果腳本任務(wù)執(zhí)行完成之后,即便進(jìn)程池還沒有執(zhí)行完成業(yè)務(wù)也會被強(qiáng)行終止。子線程也是如此,如果希望主進(jìn)程或者是主線程先執(zhí)行完自己的業(yè)務(wù)之后,依然允許子線程繼續(xù)工作而不是強(qiáng)行關(guān)閉它們,只需要設(shè)置 setDaemon() True 就可以了。

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

      線程演示案例

      單線程初始案例

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

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

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

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

      代碼示例如下:

      # coding:utf-8import timeimport random   old_lists = ['羅馬假日', '怦然心動', '時空戀旅人', '天使愛美麗', '天使之城', '倒霉愛神', '愛樂之城']new_lists = []def work():     if len(old_lists) == 0:     # 判斷 old_list 的長度,如果為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)獲取到這個隨機(jī)元素之后,將該元素從 old_lists 中刪除     new_choice_data = '%s_new' % old_choice_data    # 將隨機(jī)獲取到的隨機(jī)元素通過格式化方式重新賦值,區(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ì)耗時:{} 秒'.format(end_time - strat_time))

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


      Python線程的創(chuàng)建與常用方法(實(shí)例詳解)

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


      多線程演示案例

      代碼示例如下:

      # coding:utf-8import timeimport randomimport threading   old_lists = ['羅馬假日', '怦然心動', '時空戀旅人', '天使愛美麗', '天使之城', '倒霉愛神', '愛樂之城']new_lists = []def work():     if len(old_lists) == 0:     # 判斷 old_list 的長度,如果為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)獲取到這個隨機(jī)元素之后,將該元素從 old_lists 中刪除     new_choice_data = '%s_new' % old_choice_data    # 將隨機(jī)獲取到的隨機(jī)元素通過格式化方式重新賦值,區(qū)別于之前的元素     new_lists.append(new_choice_data)               # 將格式化的新的隨機(jī)元素添加至 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)     # 定義一個線程實(shí)例化對象執(zhí)行 work 函數(shù),因?yàn)?work 函數(shù)沒有參數(shù)所以不用傳 args         thread_list.append(thread_work)                 # 將 thread_work 添加進(jìn) thread_list         thread_work.start()                             # 啟動每一個線程      for t in thread_list:   # 通過for循環(huán)將每一個線程進(jìn)行阻塞         t.join()      if len(old_lists) ==0:         print(''old_lists' 當(dāng)前為:{}'.format(None), '當(dā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)前長度為:{}'.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ì)耗時:{} 秒'.format(end_time - strat_time))

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


      Python線程的創(chuàng)建與常用方法(實(shí)例詳解)

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


      線程的問題

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

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

      • 線程執(zhí)行的函數(shù),也同樣是無法獲取返回值的。
      • 當(dāng)多個線程同時修改文件一樣會造成被修改文件的數(shù)據(jù)錯亂的錯誤(因?yàn)槎际遣l(fā)去操作一個文件,特別是在處理交易場景的時候,需要尤為注意)。

      關(guān)于這些線程中存在的問題同樣是可以解決的,在下一章節(jié)的 線程池與全局鎖 我們會有詳細(xì)的介紹。

      推薦學(xué)習(xí):python視頻教程

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號