1. 程式人生 > >selenium+python之python多線程

selenium+python之python多線程

player 使用 內存 super 操作 相同 結束 還在 listen

程序、進程及線程的區別

計算機程序是磁盤中可執行的二進制數據(或者其他類型)他們只有在被讀取到內存中,被操作系統調用才開始他們的生命周期。

進程是程序的一次執行,每個進程都有自己的地址空間,內存,數據棧,以及其他記錄其運行軌跡的輔助數據,操作系統管理再其上面運行的所有進程,並為這些進程公平得分配時間。

線程與進程相似,不同的是所有的線程都運行在同一個進程中,共享相同的運行環境。

1.單線程

單線程時,當處理器需要處理多個任務時,必須對這些任務安排執行的順序,並按照這個順序來執行任務。

 1 from time import sleep, ctime
 2 
 3 
 4 # 聽音樂
 5
def music(): 6 print(i was listening to music! %s % ctime()) 7 sleep(2) 8 9 10 # 看電影 11 def movie(): 12 print(i was at the movies! %s % ctime()) 13 sleep(5) 14 15 16 if __name__ == __main__: 17 music() 18 movie() 19 print(all end:, ctime())

增加循環功能:

 1 from
time import sleep, ctime 2 3 4 # 聽音樂 5 def music(func, loop): 6 for i in range(loop): 7 print(i was listening to music! %s !%s % (func, ctime())) 8 sleep(2) 9 10 11 # 看電影 12 def movie(func, loop): 13 for i in range(loop): 14 print(i was listening to music! %s !%s
% (func, ctime())) 15 sleep(5) 16 17 18 if __name__ == __main__: 19 music(愛情買賣, 2) 20 movie(一代宗師, 2) 21 print(all end:, ctime())

給music()和movie()兩個函數設置參數:播放文件和播放次數。函數中通過for循環控制播放的次數。

2、多線程

python通過兩個標準庫thread和threading提供對線程的支持。thread提供了低級別的,原始的線程以及一個簡單的鎖。threading基於Java的線程模型設計。鎖(lock)和條件變量(condition)在Java中時對象的基本行為(每個對象都自帶了鎖和條件變量),而在python中則是獨立的對象。

(1)threading模塊

避免使用thread模塊,原因是它不支持守護線程。當主線程退出時,所有的子線程不關他們是否還在工作,都會被強行退出。但是我們並不希望發生這種行為。就要引入守護線程的概念。threading支持守護線程。

 1 from time import sleep, ctime
 2 import threading
 3 
 4 
 5 # 聽音樂
 6 def music(func, loop):
 7     for i in range(loop):
 8         print(i was listening to music! %s !%s % (func, ctime()))
 9         sleep(2)
10 
11 
12 # 看電影
13 def movie(func, loop):
14     for i in range(loop):
15         print(i was listening to music! %s !%s % (func, ctime()))
16         sleep(5)
17 
18 
19 # 創建線程數組
20 threads = []
21 # 創建線程t1,並添加到線程數組
22 t1 = threading.Thread(target=music, args=(愛情買賣, 2))
23 threads.append(t1)
24 # 創建線程t2,並添加到線程數組
25 t2 = threading.Thread(target=music, args=(一代宗師, 2))
26 threads.append(t2)
27 
28 if __name__ == __main__:
29     # 啟動線程
30     for t in threads:
31         t.start()
32     # 守護線程
33     for t in threads:
34         t.join()
35 
36     print(all end:, ctime())

註:import threading: 引入線程模塊

threads = []:創建線程數組,用於裝載線程。

threading.Thread(): 通過調用threading模塊的Thread()方法來創建線程。

運行結果如下:

技術分享圖片

從上面運行的結果可以看出,兩個子線程(music,movie)同時啟動於10分15秒,知道所有線程結束於10分17秒共好使2秒。從執行的結果可以看出兩個線程達到了並行工作。

優化線程的創建

從上面例子中發現線程的創建很麻煩,每創建一個線程都需要一個t(t1,t2.。。。。)當創建的線程較多時,這樣的操作及其的不方便。

 1 from time import sleep, ctime
 2 import threading
 3 
 4 
 5 # 創建超級播放器
 6 def super_player(file_, loop):
 7     for i in range(2):
 8         print(start playing: %s !%s % (file_, ctime()))
 9         sleep(2)
10 # 播放文件與播放時長
11 lists = {愛情買賣.mp3:3,阿凡達.mp4:5,傳奇.mp3:4}
12 
13 threads = []
14 files = range(len(lists))
15 print(files)
16 # 創建線程
17 print(lists.items())
18 for file_,time in lists.items():
19     t = threading.Thread(target=super_player,args=(file_,time))
20     print(t)
21     threads.append(t)
22 
23 if __name__ == __main__:
24     # 啟動線程
25     for t in files:
26         threads[t].start()
27     # 守護線程
28     for t in files:
29         threads[t].join()
30 
31     print( end:%s% ctime())

技術分享圖片

selenium+python之python多線程