线程了解以及创建线程的Threading模块中的部分方法
生活随笔
收集整理的這篇文章主要介紹了
线程了解以及创建线程的Threading模块中的部分方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
了解線程
1.什么是線程
在傳統的操作系統中,每個進程有一個地址空間,而且默認就有一個控制線程 線程,其實就是一條流水線的過程,一條流水線必須屬于一個車間,一個車間的工作過程是一個進程 車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線 流水線的工作需要帶能源,電源就相當于CPU 總而言之,進程只是用來把資源集中到一起(進程就是一個資源單位,或者說是資源集合),而線程才是cpu上的執行單位多線程:就是在一個進程中存在多個控制線程,多個控制線程共享該進程的地址空間,相當于一個車間有多條流水線,都共用一個車間的資源2.線程的創建開銷小
創建進程的開銷要遠大于線程? 這個答案顯然是否定的,就上述例子來說,你創建一個車間的時間就相當于創建一個進程的時間,而創建一個流水線的時間就好比創建一個線程。 要是創建一個車間(也就是進程),你需要去重新劃分一塊地(也就是重新分配內存空間),而創建一條流水線(也就是創建一個線程),是直 接再原來的車間里面直接創建(也就是在原來的進程中分配一塊資源) 所以我們可以理解創建線程的時間要遠遠小于創建一個進程的時間3.線程進程的區別
1.線程共享創建它的地址空間;進程有自己的地址空間 2.線程可以直接訪問其進程的數據段;進程有自己的父進程的數據段副本 3.線程可以直接與進程的其他線程通信;進程必須使用進程間通訊與同級進程通信 4.新線程很容易創建;新進程需要復制父進程 5.線程可以對統一進程的線程進行很大的控制;進程只能對子進程進行控制 6.對主線程的更改(取消、優先級更改等)可能會影響進程的其他線程的行為;對父進程的更改不會影響子進程4.為什么要使用多線程
多線程是指,在一個進程中開啟多個線程,簡單來講;如果多個任務共用一塊地址空間,那么必須在一個進程內開啟多個線程,詳細分為四點:1.多線程共享一個進程的地址空間2.線程比進程更輕量級,線程比進程更容易創建可撤銷,在許多操作系統中,創建一個線程比創建一個進程快很多倍,再有大量線程需要動態修改時,這一特征很有用3.若多個線程都是cpu密集型的,那么并不能獲得性能上的增強,但是如果存在大量的計算和大量的io處理,擁有多個線程允許這些活動彼此重疊運行,從而加快程序執行的速度4.再cpu系統中,為了最大限度利用多核,可以開啟多個線程,比開進程開銷要小的多(這一條并不適用于python)5.多線程應用舉例
開啟一個字處理軟件進程,該進程肯定需要辦不止一件事情,比如監聽鍵盤輸入,處理文字,定時自動將文字保存到硬盤,這三個任務操作 的都是同一快數據,因而不能用多進程。只能在一個進程里并發的開啟三個線程,如果時單線程,那就只能是,做一項任務時不能使用其他 功能6.經典線程模型(了解)
- 多個線程共享一個進程的地址空間的資源,是對一臺計算機上多個進程的模擬,又是也稱線程為輕量級的進程 - 而對一臺計算機上多個進程,則共享物理內存、磁盤、打印機等其他物理資源 - 多線程的運行也和多進程類似,是cpu在多個進程間的快速切換 - 不同點在于進程之間是相互競爭的,會出現爭搶資源的情況。而同一個進程是由一個程序員的程序創建的,所以同一進程內的線程是合作關系, 一個線程可以訪問另一個線程的內存地址,大家都是共享的 - 類似于進程,每個線程也有自己的堆線 - 不同于進程線程庫無法利用時鐘強制線程讓出cpu,可以調用threading_yield運行線程自動放棄cpu,讓另外一個線程運行threading模塊介紹
multiprocessing模塊完全模仿了threading模塊的接口,二者在使用層面,有很大的相似性。1.開啟線程的兩種方式
方式一:from threading import Threaddef foo():print("這是一個新開子線程")t = Thread(target=foo)t.start()print("這個在執行的是主線程")方式二:from threading import Threadclass My_foo(Thread):def run(self):print("這是一個新開子線程")t = My_foo()t.start()print("這個在執行的是主線程")2.在一個進程下開啟多個線程與在一個進程下開啟多個子進程的區別
1.開啟線程的速度快 2.線程使用的是同一個pid,進程都是由不同的pid號 3.線程間數據共享,進程沒有數據的共享,只能依靠進程間通訊3.線程相關的其他用法
Thread實例對象的方法 - isAlive() 返回線程是否存活,(這個好像和 對象.is_alive() 方法沒啥區別)import timefrom threading import Threaddef foo():time.sleep(4)print("1")t = Thread(target=foo)t.start()time.sleep(6)print(t.is_alive())print(t.isAlive())- getName():返回線程名 (這個好像也和 對象.name 方法沒啥區別) - setName():設置線程名 (這個好像也和 對象.name = "想設置的值" 方法沒啥區別)這兩段代碼就不寫了,太low了,兩個方法,就相當于換了個外套就出來溜達了threading模塊提供的一些方法: - threading.currentThread():返回當前的線程變量- 打印的類似這種:<_MainThread(MainThread, started 8084)> (這個是主線程)<Thread(Thread-1, started 11412)> (這個是子線程) - threading.enumerate():返回一個包含正在運行的線程list。正在運行指進程啟動后、結束前,不包括啟動前和終止后的線程。 - threading.activeCount():返回正在運行的線程數量 (其實就是把enumerate()中的正在運行的線程數量統計了一下)4.守護線程
- 和守護進程的定義方法是一樣的,無論是進程還是線程,都遵循:守護線程/進程會等待主線程/進程運行完畢后被銷毀 - 需要強調的是運行完畢并非終止運行- 對于主進程來說:運行完畢是指主進程代碼運行完畢- 對于主線程來說:運行完畢指的是主線程所在的進程內所有非守護線程統統運行完畢,主線程才算運行完畢 詳解:- 主進程 在其代碼結束后就已經運行完畢了(守護進程在此時就會被回收),然后主進程會一直等非守護進程的子進程都運行完畢后回收子進程的資源,如果不這樣設計就會產生僵尸進程,才會結束- 主線程 在其他非守護線程運行完畢后才算運行完畢(守護線程在此時就會被回收)。因為主線程的結束意味著進程的結束,進程整體的資源都會被回收,而進程必須保證非守護線程都運行完畢后才能結束轉載于:https://www.cnblogs.com/xiongchao0823/p/11536138.html
總結
以上是生活随笔為你收集整理的线程了解以及创建线程的Threading模块中的部分方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程 互斥锁、队列与管道、生产者消费者
- 下一篇: .dll与.lib的关系总结