網站首頁 編程語言 正文
一,實用方法
- 1.線程之間執行是無序的,cpu調度哪個線程就執行哪個線程;
- 2.主線程等待所有子線程結束后再結束,設置守護線程可以實現當主線程結束時子線程立馬結束;
- 3.設置守護線程:1.
threading.Thread
(daemon=True),2.線程對象.setDaemon(True); - 4.線程之間共享全局變量,存在資源競爭問題。
''' 線程之間執行是無序的,cpu調度哪個線程就執行哪個線程 主線程會等待所有子線程結束之后再結束,設置守護線程可以實現當主線程結束時子線程立馬結束 設置守護線程:1.threading.Thread(daemon=True),2.線程對象.setDaemon(True) 線程之間共享全局變量,存在資源競爭問題 ''' ? ? # 導入模塊(模塊名.py,包名init.py) import threading import time ? ? def task1(count): ? ? # 獲取當前線程對象 ? ? # t=threading.current_thread() ? ? # print('Task1_name:',t.name) ? ? print() ? ? for i in range(count): ? ? ? ? print('Task A ',i+1) ? ? ? ? time.sleep(0.5) ? def task2(content,count): ? ? print('Task2_name:', threading.current_thread().name) ? ? for i in range(count): ? ? ? ? print(f'{content}__Task B ',i+1) ? ? ? ? time.sleep(0.5) ? ? if __name__ == '__main__': ? ? ? t1=threading.Thread(target=task1,name='T1',daemon=True,args=(5,)) ? ? t2=threading.Thread(target=task2,name='T2',kwargs={'content':'Yes','count':5}) ? ? # 設置守護主線程的第二種方式 ? ? # t1.setDaemon(True) ? ? t2.setDaemon(True) ? ? t1.start() ? ? t1.join() ? # 阻塞函數,t1執行完畢才會向下執行 ? ? t2.start() ? ? # t2.join() ? ? print('Main thread over')
二、補充:Python多線程共享變量資源競爭問題
- 1.資源競爭問題:sum+=1執行時大致會分為三步(取值、加1、寫回),可能剛執行2步cpu就去切換到了另一個線程去執行;
- 2.解決辦法:1.使用join()方法來設置線程同步(效率不高),2.加鎖(可以保證同一時刻只有一個線程在執行) 。
''' 資源競爭問題:sum+=1執行時大致會分為三步(取值、加1、寫回),可能剛執行2步cpu就去切換到了另一個線程去執行 解決辦法:1.使用join()方法來設置線程同步(效率不高),2.加鎖(可以保證同一時刻只有一個線程在執行) ''' ? import threading import time ? ? sum=0 lock=threading.Lock() ? def add_num1(): ? ? global sum ? ? for i in range(1000000): ? ? ? ? # lock.acquire() ? ?# 加鎖 ? ? ? ? sum+=1 ? ? ? ? # lock.release() ? ?# 解鎖 ? ? print(f'{threading.current_thread().name}的計算結果是{sum}') ? ? def add_num2(): ? ? global sum ? ? for i in range(1000000): ? ? ? ? # lock.acquire() ? ? ? ? sum+=1 ? ? ? ? # lock.release() ? ? print(f'{threading.current_thread().name}的計算結果是{sum}') ? if __name__ == '__main__': ? ? t1=threading.Thread(target=add_num1) ? ? t2=threading.Thread(target=add_num2) ? ? t1.start() ? ? # 設置阻塞函數,設置線程同步 ? ? t1.join() ? ? t2.start() ? ? print(f'Main的sum值是{sum}')
原文鏈接:https://kantlee.blog.csdn.net/article/details/122665298
相關推薦
- 2022-01-30 h5 uniapp history模式下刷新頁面404
- 2021-12-04 淺談C++中const與constexpr的區別_C 語言
- 2022-07-03 C語言詳解strcmp函數的分析及實現_C 語言
- 2022-06-07 freertos實時操作系統空閑任務阻塞延時示例解析_操作系統
- 2022-01-31 (數據)圖像預處理——image augmentation圖像增廣之cutout、Mixup、Cut
- 2022-10-12 Golang中panic的異常處理_Golang
- 2023-07-07 @Autowired 注解有什么用?@Qualifier 注解有什么用? @RequestMappi
- 2022-07-08 python中的annotate函數使用_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同步修改后的遠程分支