selenium+python之python多線程
程序、進程及線程的區別
計算機程序是磁盤中可執行的二進制數據(或者其他類型)他們只有在被讀取到內存中,被操作系統調用才開始他們的生命周期。
進程是程序的一次執行,每個進程都有自己的地址空間,內存,數據棧,以及其他記錄其運行軌跡的輔助數據,操作系統管理再其上面運行的所有進程,並為這些進程公平得分配時間。
線程與進程相似,不同的是所有的線程都運行在同一個進程中,共享相同的運行環境。
1.單線程
單線程時,當處理器需要處理多個任務時,必須對這些任務安排執行的順序,並按照這個順序來執行任務。
1 from time import sleep, ctime 2 3 4 # 聽音樂 5def 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 fromtime 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多線程