python-threading模塊&多線程&守護線程&線程鎖


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM