網站首頁 編程語言 正文
前言
- 進程: 打開一個程序至少會有一個進程 ?它是cpu調度的最小的單位。
- 線程: 程序執(zhí)行的最小單位,一個進程里面至少有一個線程,cpu會控制進程里面的線程。
打個比方:
- (1)打開一個qq就是一個進程的話,那么你可以同時和好多人聊天,和一個人聊天這就是一個線程。
- (2)再打個比方,一條直行的高速公路,分好幾個車道,這整個告訴公路就相當于一個進程,那些車道就相當于一個個線程,如果有一條車道上的車拐彎,別的車道的車就要等待,不然就撞車了。
注意:
- (1)一個cpu同一時間只能處理一件事,如果同時有多個任務,那么就輪換著執(zhí)行,但是每個任務執(zhí)行的時間非常短暫,無法感受到。
- (2)使用線程的時候,不管它的順序,因為cpu是隨機調度的。
- (3)一個程序的執(zhí)行,就會有一個主線程
1. 線程
1.1 線程模塊
- Python通過兩個標準庫thread 和threading提供對線程的支持 , threading對thread進行了封裝。threading模塊中提供了Thread , Lock , RLock , Condition等組件。
- 因此在實際的使用中我們一般都是使用threading。
1.1.1 Thread類
常用參數(shù)說明:
- target:表示調用對象,即子線程要執(zhí)行的任務。
- name:子線程的名稱。
- args:傳入target函數(shù)中的位置參數(shù),是一個元組,必須加逗號。
常用實例方法:
Thread.run(self)
線程啟動時運行的方法,由該方法調用target參數(shù)所指定的函數(shù)。
Thread.start(self)
啟動線程,start方法就是去幫你調用run方法。
Thread.terminate(self)
強制終止線程。
Thread.join(self, timeout=None)
阻塞調用,主線程進行等待。
Thread.setDaemon(self, daemonic)
將子線程設置為守護線程。
Thread.getName(self, name)
獲取線程名稱。
Thread.setName(self, name)
設置線程名稱:
但是剛剛也講了實際使用中我們都是使用的threading模塊,所以此處只是簡單介紹一下Thread類,下面講解都是使用的threading模塊!
1.2 創(chuàng)建線程
在python中創(chuàng)建線程有兩種方式:
- 實例Thread類;
- 繼承重寫Thread類。
1.2.1 實例Thread類法創(chuàng)建線程
(需要注意的是:下面在主線程里添加了t1,t2兩個子線程,①如果沒有設置setDaemon守護線程,那么整個文件順序執(zhí)行完[即主線程]之后,對應的兩個子線程并行執(zhí)行;②如果設置了守護線程,那么對應的設置了守護線程的子線程在主線程執(zhí)行完之后立馬被殺死?。?/p>
# -*- coding: utf-8 -*- import threading import time # 定義線程要運行的函數(shù) def sing(): # 為了便于觀察,sleep1秒 for i in range(5): print("正在唱歌......") time.sleep(1) def dance(): # 為了便于觀察,sleep1秒 for i in range(5): print("正在跳舞......") time.sleep(1) if __name__ == '__main__': # 創(chuàng)建兩個線程實例 t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) # 設置守護線程 t1.setDaemon(True) # 守護線程:把子線程作為主線程的守護線程 t2.setDaemon(True) # 啟動線程 t1.start() t2.start() print('主線程結束')
未設置t1,t2為守護線程時的輸出:
設置t1,t2為守護線程時的輸出:
1.2.1 繼承重寫Thread類法創(chuàng)建線程
# -*- coding: utf-8 -*- import threading import time # 繼承threading中的Thread類 class MyThread(threading.Thread): # 線程中所需要的參數(shù) def __init__(self, name): super().__init__() self.name = name # 重構run方法,注意這個是表示線程活動的方法,必須有! def run(self): print('I am %s' % self.name) time.sleep(2) # 創(chuàng)建線程實例 t1 = MyThread('guhanzhe') t2 = MyThread('coolboy') # 啟動線程 t1.start() t2.start() # 打印線程名 print(t1.getName()) print(t2.getName())
1.3 Join & setDaemon
在說這兩個方法之前 , 需要知道主線程與子線程的概念:
- 主線程 : 當一個程序啟動時 , 就有一個線程開始運行 , 該線程通常叫做程序的主線程。
- 子線程 : 因為程序是開始時就執(zhí)行的 , 如果你需要再創(chuàng)建線程 , 那么創(chuàng)建的線程就是這個主線程的子線程。
主線程的重要性體現(xiàn)在兩方面 :
- 是產生其他子線程的線程;
- 通常它必須最后完成執(zhí)行比如執(zhí)行各種關閉操作。
1.3.1 join
- join : 阻塞調用程序 , 直到調用join () 方法的線程執(zhí)行結束, 才會繼續(xù)往下執(zhí)行。
# -*- coding: utf-8 -*- import threading import time def run(name): print('I am %s' % name) time.sleep(2) print('子線程結束......') t1 = threading.Thread(target=run, args=('guhanzhe', )) t1.start() # 阻塞主線程,等待子線程運行結束 t1.join() print('主線程結束......')
大家可以嘗試不加join()的話輸出是什么樣的哦~
1.3.2 setDaemon
- setDaemon() 與 join() 基本上是相對的 , join會等子線程執(zhí)行完畢 ; 而setDaemon則不會等,主線程結束,對應的設置了守護線程的子線程也會立馬被殺死。
# -*- coding: utf-8 -*- import threading import time def run(name): print('I am %s' % name) time.sleep(2) print('子線程結束......') t1 = threading.Thread(target=run, args=('guhanzhe', )) # 設置守護線程 t1.setDaemon(True) t1.start() print('主線程結束......')
原文鏈接:https://juejin.cn/post/7107598958507065352
相關推薦
- 2022-06-12 C語言全方位講解數(shù)組的使用_C 語言
- 2023-01-15 C++實現(xiàn)自定義撤銷重做功能的示例代碼_C 語言
- 2022-08-11 Python中函數(shù)的創(chuàng)建及調用_python
- 2022-04-12 Oracle?Session每日統(tǒng)計功能實現(xiàn)_oracle
- 2023-12-02 微信小程序隱藏頁面滾動條
- 2022-05-03 使用EF的Code?First模式操作數(shù)據(jù)庫_實用技巧
- 2022-12-12 flutter?Bloc?add兩次只響應一次問題解析_Android
- 2023-01-12 python列表添加元素append(),extend(),insert(),+list的區(qū)別及說明
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支