網站首頁 編程語言 正文
CPython implementation detail:?在 CPython 中,由于存在全局解釋器鎖,?同一時刻只有一個線程可以執行 Python 代碼(雖然某些性能導向的庫可能會去除此限制)。 如果你想讓你的應用更好地利用多核心計算機的計算資源,推薦你使用multiprocessing或concurrent.futures.ProcessPoolExecutor但是,如果你想要同時運行多個 I/O 密集型任務,則多線程仍然是一個合適的模型。
再來引入一個概念:
- 并行(parallelism):? ?是同一時刻,每個線程都在執行。
- 并發(concurrency):是同一時刻,只有一個線程執行,然后交替執行(再加上電腦運行速度快)。所以從一個宏觀的角度來看,似乎每個線程都在執行了。
可以知道python線程是并發的。
?關于線程Threading的方法(獲取線程的某種屬性)。
- active_count():它會獲得,執行這個方法時,還存活的Thread()的對象數量。
- enumerate():返回當前所有存活的Thread對象的列表。
- current_thread():返回當前調用者 控制Thread()線程的對象。如果調用者控制的線程對象不是由threading創建,則會返回一個功能受限的虛擬線程對象。
- get_ident():返回當前線程的“線程標識符”。它是一個非零整數。
- get_native_id():返回內核分配給當前線程的原生集成線程ID。這是一個非負整數。
- main_thread():返回主線程(thread)對象,一般是python解釋器開始時創建的線程。
線程簡介:
Thread類表示在單獨的控制線程中運行的活動。指定活動有兩種方法:將可調用對象傳遞給構造函數,或重寫子類中的run()方法。子類中不應重寫任何其他方法(構造函數除外)。換句話說,只重寫這個類的_init__;()和run()方法
一旦線程活動開始,該線程會被認為是 '存活的' 。當它的run()??方法終結了(不管是正常的還是拋出未被處理的異常),就不是'存活的'。?
先看看該類的參數有哪些:
class?threading.
Thread
(group=None,?target=None,?name=None,?args=(),?kwargs={},?*,?daemon=None)
- group:官方的解釋是,為了日后擴展ThreadGroup類實現而保留。(唉,我也不太清楚的)
- target:是要于多線程的函數
- name:是線程的名字
- args :函數的參數,類型是元組()
- kwargs:函數的參數,類型是字典{}
為了便于理解,先舉一個小例子,為了方便理解,先簡單了解一下該類的一個方法(函數在類中被稱為方法):
- start():開始線程活動
import threading import time ? # 打印函數a def printa(a): ? ? count = 0 ? ? while count < 5: ? ? ? ? time.sleep(2) ? ? ? ? print("線程:%s。打?。?s。時間:%s。" % (threading.current_thread().name, a, time.ctime())) ? ? ? ? count += 1 ? # 打印函數b def printb(b): ? ? count = 0 ? ? while count < 5: ? ? ? ? time.sleep(4) ? ? ? ? print("線程:%s。打?。?s。時間:%s。" % (threading.current_thread().name, b, time.ctime())) ? ? ? ? count += 1 ? # threading.Thread(target=,args=(),name='') t1 = threading.Thread(target=printa, args=(10,), name='線程1') t2 = threading.Thread(target=printb, args=(20,), name='線程2') ? t1.start() t2.start() ? t1.join() t2.join() ? print("退出主線程")
import threading import time ? # 打印函數a def printa(a): ? ? count = 0 ? ? while count < 5: ? ? ? ? time.sleep(2) ? ? ? ? print("線程:%s。打印:%s。時間:%s。" % (threading.current_thread().name, a, time.ctime())) ? ? ? ? count += 1 ? # threading.Thread(target=,args=(),name='') threadList = [] for i in range(3): ? ? t = threading.Thread(target=printa, args=(i,)) ? ? threadList.append(t) ? for t in threadList: ? ? t.start() ? for t in threadList: ? ? t.join() ? ?? print("退出主線程")
原文鏈接:https://blog.csdn.net/weixin_58619062/article/details/124116159
相關推薦
- 2022-09-26 Linux系統監控(top,ps,netstat,kill命令),定時任務,系統啟動(系統的啟動級別
- 2022-05-19 golang?中?channel?的詳細使用、使用注意事項及死鎖問題解析_Golang
- 2022-12-15 Qt開發之使用socket實現遠程控制_C 語言
- 2022-04-01 關于使用pyqt彈出消息提示框的問題_python
- 2022-07-07 C#操作注冊表之Registry類_C#教程
- 2022-09-14 Python深入淺出分析元類_python
- 2022-08-20 Python中range()與np.arange()的具體使用_python
- 2023-02-05 Python中import語句用法案例講解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支