python筆記7-多線程threading之函數式
前言
1.python環境2.7
2.threading模塊系統自帶
單線程
1.平常寫的代碼都是按順序挨個執行的,就好比吃火鍋和哼小曲這兩個行為事件,定義成兩個函數,執行的時候,是先吃火鍋再哼小曲,這種就是單線程的行為。
# coding:utf-8 import time def chi(): print("%s 吃火鍋開始:" % time.ctime()) time.sleep(1) print("%s 吃火鍋結束--" % time.ctime()) def heng(): print("%s 哼著小曲開始:" % time.ctime()) time.sleep(1) print("%s 哼著小曲結束--" % time.ctime()) if __name__ == "__main__": chi() heng() Thu Jan 11 16:32:37 2018 吃火鍋開始: Thu Jan 11 16:32:38 2018 吃火鍋結束-- Thu Jan 11 16:32:38 2018 哼著小曲開始: Thu Jan 11 16:32:39 2018 哼著小曲結束--
2.生活中我們是可以一邊吃火鍋一邊哼小曲的,那麽代碼裏面如何實現這種同時進行的不同事件呢?這就是接下來要講的python多線程
多線程threading
1.Python通過兩個標準庫thread和threading提供對線程的支持。thread提供了低級別的、原始的線程以及一個簡單的鎖.Threading模塊封裝了一些常用的方法,初學者直接學這個模塊就行了。
2.Python中使用線程有兩種方式:函數或者用類來包裝線程對象
3.threading.Thread裏面幾個參數介紹:
class Thread(_Verbose)
__init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None)
*group*:group參數必須為空,參數group是預留的,用於將來擴展;
參數args和kwargs分別表示調用target時的參數列表和關鍵字參數。
*target*: 參數target是一個可調用對象(也稱為活動[activity]),在線程啟動後執行
*name*: 參數name是線程的名字。默認值為“Thread-N“,N是一個數字。
*args*:傳遞給線程函數target的參數,他必須是個tuple類型.
*kwargs*:kwargs表示關鍵字參數。字典類型 {}.
函數式
1.先看個簡單案例,這種是執行函數,函數不帶參數的
# coding:utf-8 import threading import time def chi(): print("%s 吃著火鍋開始:" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:涮羊肉" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:涮牛肉" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:貢丸" % time.ctime()) time.sleep(1) print("%s 吃火鍋結束!" % time.ctime()) def ting(): print("%s 哼著小曲1!" % time.ctime()) time.sleep(2) print("%s 哼著小曲2!" % time.ctime()) time.sleep(2) print("%s 哼著小曲3!" % time.ctime()) time.sleep(2) print("%s 哼著小曲4!" % time.ctime()) time.sleep(2) print("%s 哼著小曲5!" % time.ctime()) time.sleep(2) # 創建線程數組 threads = [] # 創建線程t1,並添加到線程數組 t1 = threading.Thread(target=chi) threads.append(t1) # 創建線程t2,並添加到線程數組 t2 = threading.Thread(target=ting) threads.append(t2) if __name__ == ‘__main__‘: # 啟動線程 for t in threads: t.start()
運行結果:
Thu Jan 11 16:35:50 2018 吃著火鍋開始:
Thu Jan 11 16:35:50 2018 哼著小曲1!
Thu Jan 11 16:35:51 2018 吃著火鍋:涮羊肉
Thu Jan 11 16:35:52 2018 哼著小曲2!Thu Jan 11 16:35:52 2018 吃著火鍋:涮牛肉
Thu Jan 11 16:35:53 2018 吃著火鍋:貢丸
Thu Jan 11 16:35:54 2018 哼著小曲3!Thu Jan 11 16:35:54 2018 吃火鍋結束!
Thu Jan 11 16:35:56 2018 哼著小曲4!
Thu Jan 11 16:35:58 2018 哼著小曲5!
2.帶參數的用args傳元組類型(參數最後多加一個逗號“,”要不然會報錯)
# coding:utf-8 import threading import time def chi(threadName,name): print("%s 吃著%s開始:" % (time.ctime(),threadName)) print("%s 吃著火鍋:涮羊肉" % time.ctime()) time.sleep(1) time.sleep(1) print("%s 吃著火鍋:涮牛肉" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:貢丸" % time.ctime()) time.sleep(1) print("%s 吃著%s結束--" % (time.ctime(),threadName)) print("%s 運行結束!"%name) def ting(threadName): print("%s 哼著%s1!" % (time.ctime(),threadName)) time.sleep(2) print("%s 哼著小曲2!" % time.ctime()) time.sleep(2) print("%s 哼著小曲3!" % time.ctime()) time.sleep(2) print("%s 哼著小曲4!" % time.ctime()) time.sleep(2) print("%s 哼著小曲5!" % time.ctime()) time.sleep(2) # 創建線程數組 threads = [] # 創建線程t1,並添加到線程數組 # t1 = threading.Thread(target=chi, args=("火鍋","吃火鍋",)) # 傳kwargs參數 t1 = threading.Thread(target=chi, kwargs={"threadName":"火鍋","name":"吃火鍋"}) threads.append(t1) # 創建線程t2,並添加到線程數組 t2 = threading.Thread(target=ting,args=("小曲",)) threads.append(t2) if __name__ == ‘__main__‘: # 啟動線程 for t in threads: t.start()
3.或者用kwargs傳字典{}類型
# 創建線程t1,並添加到線程數組
# t1 = threading.Thread(target=chi, args=("火鍋","吃火鍋",))
# 傳kwargs參數
t1 = threading.Thread(target=chi, kwargs={"threadName":"火鍋","name":"吃火鍋"})
封裝類和方法的調用下篇介紹
python筆記7-多線程threading之函數式