1、threading模塊是Python里面常用的線程模塊,多線程處理任務對於提升效率非常重要,先說一下線程和進程的各種區別,如圖
概括起來就是
IO密集型(不用CPU)
多線程
計算密集型(用CPU)
多進程
使用線程和進程的目的都是為了提升效率
(1)單進程單線程,主進程、主線程
(2)自定義線程:
主進程
主線程
子線程
2、threading模塊可以創建多個線程,不過由於GIL鎖的存在,Python在多線程里面其實是快速切換,下面代碼是創建線程的簡單體驗
import time import threading def f0(): pass def f1(a1,a2): time.sleep(5) f0() '''下面代碼是直接運行下去的,不會等待函數里面設定的sleep''' t= threading.Thread(target=f1,args=(111,112))#創建線程 t.setDaemon(True)#設置為后台線程,這里默認是False,設置為True之后則主線程不用等待子線程 t.start()#開啟線程 t = threading.Thread(target=f1, args=(111, 112)) t.start() t = threading.Thread(target=f1, args=(111, 112)) t.start() #默認情況下程序會等線程全部執行完畢才停止的,不過可以設置更改為后台線程,使主線程不等待子線程,主線程結束則全部結束
在線程里面setDaemon()和join()方法都是常用的,他們的區別如下
(1)join ()方法:主線程A中,創建了子線程B,並且在主線程A中調用了B.join(),那么,主線程A會在調用的地方等待,直到子線程B完成操作后,
才可以接着往下執行,那么在調用這個線程時可以使用被調用線程的join方法。join([timeout]) 里面的參數時可選的,代表線程運行的最大時
間,即如果超過這個時間,不管這個此線程有沒有執行完畢都會被回收,然后主線程或函數都會接着執行的,如果線程執行時間小於參數表示的
時間,則接着執行,不用一定要等待到參數表示的時間。
(2)setDaemon()方法。主線程A中,創建了子線程B,並且在主線程A中調用了B.setDaemon(),這個的意思是,把主線程A設置為守護線程,這
時候,要是主線程A執行結束了,就不管子線程B是否完成,一並和主線程A退出.這就是setDaemon方法的含義,這基本和join是相反的。此外,還有
個要特別注意的:必須在start() 方法調用之前設置,如果不設置為守護線程,程序會被無限掛起,只有等待了所有線程結束它才結束。
3、Python多線程里面的鎖的
在多線程處理任務的時候,在同時操作一個數據的時候可能會造成臟數據,這時候就出現了鎖的概念,也就是有一個線程在操作該數據的時候,就把
該數據鎖上,防止別的線程操作,操作完了再釋放鎖。
4、Python多線程里面的event方法
該方法的具體用法是給線程設置紅綠燈,紅燈表示停,綠燈表示運行,如代碼
import threading import time def do(event): print('start') event.wait()#紅燈,所有線程執行都這里都在等待 print('end') event_obj = threading.Event()#創建一個事件 for i in range(10):#創建10個線程 t= threading.Thread(target=do,args=(event_obj,)) t.start() time.sleep(5) event_obj.clear()#讓燈變紅,默認也是紅的,阻塞所有線程運行 data= input('請輸入要:') if data =='True': event_obj.set()#變綠燈
結果如圖