1. 程式人生 > >python 多執行緒執行任務

python 多執行緒執行任務

今日份學習筆記:用於壓測,開發說需要利用執行緒往redis裡面插入資料,接觸到python 多執行緒處理

自己就寫了一個hin簡單的多執行緒,

瞭解到實現多執行緒的方式有兩種

① 給建構函式傳遞迴調物件

②重寫Thread類的run()方法

我這裡用到的是①

具體步驟如下:

①匯入模組

import threading

②建立執行緒組

threads=[]

③建立一個執行緒並將執行緒加入執行緒組

t =threading.Thread(target=function_name, args=())

function_name:即需要執行緒去執行的方法名

args:需要執行的方法所需要的引數,該屬性是一個元組,當只有一個引數時需要在末尾加入逗號

#執行緒需要執行的方法

def insert_trans_to_redis1():

    """塞入運單號到redis"""

    trans = sel_trans()

    re = connect_redis()

    if re:

        for tr in trans:

            re.lpush("camel:waybill:trans:list", tr)

        print re.llen("camel:waybill:trans:list")

        print u"執行時間1為:%s"%time.ctime()

        time.sleep(5)

        print u"結束時間1%s"%time.ctime()

def insert_trans_to_redis2():

    """塞入運單號到redis"""

    trans = sel_trans()

    re = connect_redis()

    if re:

        for tr in trans:

            re.lpush("camel:waybill:trans:list", tr)

        print re.llen("camel:waybill:trans:list")

        print u"執行時間2為:%s"%time.ctime()

        time.sleep(3)

        print u"結束時間2%s"%time.ctime()

#執行緒的建立

threads = []

t1= threading.Thread(target=insert_trans_to_redis1) 

#insert_trans_to_redis是我的方法名,不需要引數

threads.append(t1)

t2= threading.Thread(target=insert_trans_to_redis2)

threads.append(t2)

④啟動執行緒

①第一種寫法:

for t in threads:

        t.setDaemon(True)

        t.start()

print "all over %s"%time.ctime()

當子執行緒結束之後,就退出了,沒有執行主執行緒,為啥呢?執行結果如圖1

②第二種寫法:

for t in threads:

        t.start()

t.join()

print "all over %s"%time.ctime()

當所有執行緒執行完畢後退出,如圖2

③第三種寫法

    for t in threads:

        t.start()

    for t in threads:

        t.join()

    #join()阻塞執行緒

    print u"all over %s"%time.ctime()

當所有子執行緒執行完畢之後再執行主執行緒,執行完畢之後再退出,執行結果如圖③

通過執行結果可看出②和③的區別

方式一

方式二

方式三:

守護執行緒的概念

守護執行緒與非守護執行緒的區別

守護執行緒:當主執行緒執行完畢之後,守護執行緒就會被銷燬而導致結束了

非守護執行緒:主執行緒執行完畢之後,必須等到子執行緒執行完才可以,不受主執行緒執行結束的影響,箱單主執行緒還需要等待非守護執行緒

需要強調的是:執行完畢並非終止執行

1.對主程序來說,執行完畢指的是主程序程式碼執行完畢 

2.對主執行緒來說,執行完畢指的是主執行緒所在的程序內所有非守護執行緒統統執行完畢,主執行緒才算執行完畢

詳細解釋: 

1 主程序在其程式碼結束後就已經算執行完畢了(守護程序在此時就被回收),然後主程序會一直等非守護的子程序都執行完畢後回收子程序的資源(否則會產生殭屍程序),才會結束,

2 主執行緒在其他非守護執行緒執行完畢後才算執行完畢(守護執行緒在此時就被回收)。因為主執行緒的結束意味著程序的結束,程序整體的資源都將被回收,而程序必須保證非守護執行緒都執行完畢後才能結束。

執行緒阻塞的概念

阻塞執行緒join和非阻塞執行緒不join的區別

join()會阻塞執行緒,等到最長時間的執行緒結束之後才會退出或執行後面的,主要看怎麼寫,可以參考②③