<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在Python中有很多的多執行緒模組,其中 thread
ing 模組就是比較常用的。下面就來看一下如何利用 thread
ing 建立執行緒以及它的常用方法。
函數名 | 介紹 | 舉例 |
---|---|---|
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) |
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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45