Python之threading多線程


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()#變綠燈

  結果如圖

 


免責聲明!

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



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