1、統計多線程執行的時間-方式一
- 進程是資源的集合,也就是一個程序
- 線程是程序運行的最小單位
- 線程是進程里面的
- 默認一個進程里只有一個線程
1 import threading,time 2 3 def insert_db(): 4 time.sleep(3) 5 print('insert_db over') 6 7 8 start_time = time.time() 9 for i in range(3): # 串行的方式 10 insert_db() 11 end_time = time.time() 12 print('串行的執行時間:',end_time-start_time) 13 14 start_time2 = time.time() 15 # 第二種方式,思路是判斷當前存活的線程個數 16 for i in range(3): 17 t = threading.Thread(target = insert_db) 18 t.start() 19 20 # threading.activeCount()返回當前活躍的線程數 21 while threading.activeCount() != 1: 22 pass 23 end_time2 = time.time() 24 25 print('多線程的執行時間:',end_time2-start_time2) 26 print('over.....')
結果:
2、統計多線程執行時間的第二種方式
1 import threading,time 2 3 def insert_db(): 4 time.sleep(3) 5 print('insert_db over') 6 7 8 start_time = time.time() 9 for i in range(3): # 串行的方式 10 insert_db() 11 end_time = time.time() 12 print('串行的執行時間:',end_time-start_time) 13 14 # 統計多線程執行時間:方式一 15 threads = [] 16 start_time2 = time.time() 17 for i in range(3): 18 t = threading.Thread(target=insert_db) 19 t.start() 20 threads.append(t) 21 22 for t in threads: 23 t.join() # 等待子線程執行完成,主線程在接着執行 24 25 end_time2 = time.time() 26 27 print('多線程的執行時間:',end_time2-start_time2) 28 print('over.....')
3、統計多線程執行時間:錯誤方式
1 import threading,time 2 3 def insert_db(): 4 time.sleep(3) 5 print('insert_db over') 6 7 8 start_time = time.time() 9 for i in range(3): # 串行的方式 10 insert_db() 11 end_time = time.time() 12 print('串行的執行時間:',end_time-start_time) 13 14 # 統計多線程執行時間:方式一 15 threads = [] 16 start_time2 = time.time() 17 for i in range(3): 18 t = threading.Thread(target=insert_db) 19 t.start() 20 threads.append(t) 21 22 # for t in threads: 23 # t.join() # 等待子線程執行完成,主線程在接着執行 24 25 end_time2 = time.time() 26 27 # 多線程的執行時間: 0.0010039806365966797??為啥不對? 28 # 主線程,也就是程序一開始運行的時候,最初的那個線程 29 # 這里的時間是主線程跑完的時間,沒包含子線程執行的時間 30 # 子線程,通過thread類實例化的線程,都是子線程 31 print('多線程的執行時間:',end_time2-start_time2) 32 print('over.....')
結果:
4、實例(下載圖片)
1 import threading 2 import requests 3 import hashlib 4 5 def down_load(url): 6 name = hashlib.md5(url.encode()).hexdigest() 7 r = requests.get(url) 8 with open('%s.jpg'%name,'wb') as fw: 9 fw.write(r.content) 10 11 12 l = [ 13 'http://www.nnzhp.cn/wp-content/themes/QQ/images/logo.jpg', 14 'http://www.nnzhp.cn/wp-content/uploads/2016/12/2016aj5kn45fjk5-150x150.jpg', 15 'http://www.nnzhp.cn/wp-content/themes/QQ/images/thumbnail.png' 16 ] 17 18 # 串行下載 19 for url in l: 20 down_load(url) 21 22 # 多線程下載 23 for i in l: 24 t = threading.Thread(target=down_load,args=[i]) 25 t.start() 26 27 while threading.activeCount() != 1: 28 pass 29 30 print('down load over ...')
5、??
1 # #多線程運行函數是,函數的返回值是拿不到的 2 # #所以定義一個list,把函數運行的結果都存進去就ok 3 # case_result = [] 4 # 5 # def run_case(case_name): 6 # print('run case...',case_name) 7 # case_result.append({case_name:'success'})
6、守護線程
- 未設置為守護線程
1 # 守護線程:一旦主線程死掉,那么守護線程不管有沒有執行完成,全部結束 2 3 import threading 4 import time 5 6 def talk(name): 7 print('正在和%s聊天'%name) 8 time.sleep(200) 9 10 def shipin(name): 11 print('正在和%s視頻'%name) 12 time.sleep(300) 13 14 print('qq主窗口') 15 t1 = threading.Thread(target=talk,args=['lzh']) 16 # 如果沒有設置為守護線程,所有線程運行結束后,程序才會結束 17 # 設置線程為守護線程 18 # t1.setDaemon(True) 19 t1.start() 20 21 22 t2 = threading.Thread(target=shipin,args=['zsb']) 23 # 設置線程為守護線程 24 # t2.setDaemon(True) 25 t2.start() 26 27 28 time.sleep(5) 29 print('結束。。。') 30 31 #所有線程運行結束后,程序才會結束
運行結果:如下圖,程序並沒有結束
- 設置為守護線程
-
1 # 守護線程:一旦主線程死掉,那么守護線程不管有沒有執行完成,全部結束 2 3 import threading 4 import time 5 6 def talk(name): 7 print('正在和%s聊天'%name) 8 time.sleep(200) 9 10 def shipin(name): 11 print('正在和%s視頻'%name) 12 time.sleep(300) 13 14 print('qq主窗口') 15 t1 = threading.Thread(target=talk,args=['lzh']) 16 # 如果沒有設置為守護線程,所有線程運行結束后,程序才會結束 17 # 設置線程為守護線程 18 t1.setDaemon(True) 19 t1.start() 20 21 22 t2 = threading.Thread(target=shipin,args=['zsb']) 23 # 設置線程為守護線程 24 t2.setDaemon(True) 25 t2.start() 26 27 28 time.sleep(5) 29 print('結束。。。')
運行結果:
7、線程鎖??
1 # 線程鎖 2 #多個線程同時操作同一個數據的時候,會有問題 3 4 import threading 5 6 count = 0 7 lock = threading.Lock() 8 9 def test(): 10 global count 11 12 #lock.acquire(timeout = 3) #加鎖,單位?? 13 14 count += 1 15 16 # lock.release() #解鎖 17 # 線程死鎖 18 19 for i in range(100): 20 t = threading.Thread(target = test) 21 t.start() 22 23 print(count)