【Python】多線程及例子

1.進程與線程定義

進程:進程是資源(CPU、內存等)分配的最小單位,進程有獨立的地址空間與系統資源,一個進程可以包含一個或多個線程。

線程:線程是CPU調度的最小單位,是進程的一個執行流,線程依賴於進程而存在,線程共享所在進程的地址空間和系統資源,每個線程有自己的堆棧和局部變量。

併發:當系統只有一個CPU時,想執行多個線程,CPU就會輪流切換多個線程執行,當有一個線程被執行時,其他線程就會等待,但由於CPU調度很快,所以看起來像多個線程同時執行。

並行:當系統有多個CPU時,執行多個線程,就可以分配到多個CPU上同時執行。 

同步:調用者調用一個功能時,必須要等到這個功能執行完返回結果後,才能再調用其他功能。

異步:調用者調用一個功能時,不會立即得到結果,而是在調用發出後,被調用功能通過狀態、通知來通告調用者,或通過回調函數處理這個調用。

2.爲什麼要使用多線程

線程在程序中是獨立的、併發的執行流。與分隔的進程相比,進程中線程之間的隔離程度要小,它們共享內存、文件句柄和其他進程應有的狀態。

因爲線程的劃分尺度小於進程,使得多線程程序的併發性高。進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

線程比進程具有更高的性能,這是由於同一個進程中的線程都有共性多個線程共享同一個進程的虛擬空間。線程共享的環境包括進程代碼段、進程的公有數據等,利用這些共享的數據,線程之間很容易實現通信。

操作系統在創建進程時,必須爲該進程分配獨立的內存空間,並分配大量的相關資源,但創建線程則簡單得多。因此,使用多線程來實現併發比使用多進程的性能要高得多。

總結起來,使用多線程編程具有如下幾個優點:

  • 進程之間不能共享內存,但線程之間共享內存非常容易。

  • 操作系統在創建進程時,需要爲該進程重新分配系統資源,但創建線程的代價則小得多。因此,使用多線程來實現多任務併發執行比使用多進程的效率高。

  • Python 語言內置了多線程功能支持,而不是單純地作爲底層操作系統的調度方式,從而簡化了 Python 的多線程編程。

3.多線程模塊

python中主要用threading模塊提供對線程的支持.

3.1threading模塊

threading模塊常用函數

  • threading.current_thread(): 返回當前的線程對象。
  • threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啓動後、結束前,不包括啓動前和終止後的線程。
  • threading.active_count(): 返回正在運行的線程數量,與len(threading.enumerate())有相同的結果。

Thread類

通過threading.Thread()創建線程對象

主要參數:

threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

  • group 默認爲 None,爲了日後擴展 ThreadGroup 類實現而保留。
  • target 是用於 run() 方法調用的可調用對象。默認是 None,表示不需要調用任何方法。
  • name 是線程名稱。默認情況下,由 "Thread-N" 格式構成一個唯一的名稱,其中 N 是小的十進制數
  • args 是用於調用目標函數的參數元組。默認是 ()
  • kwargs 是用於調用目標函數的關鍵字參數字典。默認是 {}。
  • daemon表示線程是不是守護線程。

Thread類常用方法與屬性

  • run(): 用以表示線程活動的方法。
  • start():啓動線程活動。 
  • join(timeout=None): 等待至線程中止。這阻塞調用線程直至線程的join() 方法被調用中止-正常退出或者拋出未處理的異常-或者是可選的超時發生。
  • isAlive(): 返回線程是否活動的。
  • getName(): 返回線程名。
  • setName(): 設置線程名。
  • name:線程對象名字
  • setDaemon():設置是否爲守護線程

 

 

 

參考:

1.https://www.cnblogs.com/fengf233/p/11468541.html

2.https://www.jianshu.com/p/a4aedd66af7c

3.https://blog.csdn.net/weixin_40481076/article/details/101594705

4.https://docs.python.org/zh-cn/3.7/library/threading.html

5.https://www.cnblogs.com/luyuze95/p/11289143.html

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