總結:python多線程與線程池編程

目錄

 

1、併發與並行

2、多線程編程

2-1多線程的實現

2-1-1實例化Thread

2-1-2繼承Thread

2-2 join()方法

2-3setDaemon(True)


1、併發與並行

並行:兩個或多個事件在同一時刻(同一時間點)發生

併發:兩個或多個事件在同一時間段發生

並行指的多個cpu,併發主要針對一個cpu

併發的目的是充分利用服務器的每一個核,以達到最高處理性能

2、多線程編程

2-1多線程的實現

2-1-1實例化Thread

例1:

from threading import Thread
import  time

def sleep_task(sleep_time):
    print("start spleep {}s".format(sleep_time))
    time.sleep(3)
    print("end spleep {}s".format(sleep_time))

if __name__ == '__main__':
    t1 = Thread(target=sleep_task,args=(3,))
    t2 = Thread(target=sleep_task,args=(2,))
    t1.start()
    t2.start()
    print("main end")

結果如下:

start spleep 3s
start spleep 2s
main end
end spleep 3s
end spleep 2s

需要注意的是:

1、在實例化的過程中,參數target的值爲方法名, 如target=sleep_task,而非target=sleep_task()。

2、在實例化的過程中,參數args的值所需格式爲Iterable。如int類型的3,放在元組中需寫爲(3,)。

 

知識點:

當一個進程啓動之後,會默認產生一個主線程,因爲線程是程序執行流的最小單元,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下(其實就是setDaemon(False)),主線程執行完自己的任務以後,就退出了,此時子線程會繼續執行自己的任務,直到自己的任務結束。

2-1-2繼承Thread

from threading import Thread
import  time

class sleepThrad(Thread):
    def __init__(self,sleep_time):
        self.sleep_time = sleep_time
        super().__init__()#子類調用父類的__init__()方法進行必要的初始化

    def run(self):
        print("sleep {} seconds start".format(self.sleep_time))
        time.sleep(self.sleep_time)
        print("sleep {} seconds end".format(self.sleep_time))

if __name__ == '__main__':
    t1 = sleepThrad(2)
    t2 = sleepThrad(3)
    t1.start()
    t2.start()
    print("main end")

結果如下:

start spleep 3s
start spleep 2s
main end
end spleep 3s
end spleep 2s

 

2-2 join()方法

join所完成的工作就是線程同步,即主線程任務結束之後,進入阻塞狀態,一直等待其他的子線程執行結束之後,主線程再終止。

如下例子:

from threading import Thread
import  time

def sleep_task(sleep_time):
    print("start spleep {}s".format(sleep_time))
    time.sleep(3)
    print("end spleep {}s".format(sleep_time))

if __name__ == '__main__':
    t1 = Thread(target=sleep_task,args=(3,))
    t2 = Thread(target=sleep_task,args=(2,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print("main end")

輸入結果爲:

start spleep 3s
start spleep 2s
end spleep 3s
end spleep 2s
main end

2-3setDaemon(True)

當我們使用setDaemon(True)方法,設置子線程爲守護線程時,主線程一旦執行結束,則全部線程全部被終止執行,可能出現的情況就是,子線程的任務還沒有完全執行結束,就被迫停止。例子如下:

from threading import Thread
import  time

def sleep_task(sleep_time):
    print("start spleep {}s".format(sleep_time))
    time.sleep(3)
    print("end spleep {}s".format(sleep_time))

if __name__ == '__main__':
    t1 = Thread(target=sleep_task,args=(3,))
    t2 = Thread(target=sleep_task,args=(2,))
    t2.setDaemon(True)
    t1.start()
    t2.start()
    print("main end")

結果如下:

start spleep 3s
start spleep 2s
main end
end spleep 3s

注意請確保setDaemon()在start()之前。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章