Python多線程的使用詳情
更新時間:2022年04月11日 19:25:01 作者:程序員班長
這篇文章主要介紹了Python多線程的使用詳情,線程之間執(zhí)行是無序的,cpu調(diào)度哪個線程就執(zhí)行哪個線程,下文相關(guān)介紹需要的小伙伴可以參考一下
一,實用方法
- 1.線程之間執(zhí)行是無序的,cpu調(diào)度哪個線程就執(zhí)行哪個線程;
- 2.主線程等待所有子線程結(jié)束后再結(jié)束,設(shè)置守護(hù)線程可以實現(xiàn)當(dāng)主線程結(jié)束時子線程立馬結(jié)束;
- 3.設(shè)置守護(hù)線程:1.
threading.Thread
(daemon=True),2.線程對象.setDaemon(True); - 4.線程之間共享全局變量,存在資源競爭問題。
''' 線程之間執(zhí)行是無序的,cpu調(diào)度哪個線程就執(zhí)行哪個線程 主線程會等待所有子線程結(jié)束之后再結(jié)束,設(shè)置守護(hù)線程可以實現(xiàn)當(dāng)主線程結(jié)束時子線程立馬結(jié)束 設(shè)置守護(hù)線程:1.threading.Thread(daemon=True),2.線程對象.setDaemon(True) 線程之間共享全局變量,存在資源競爭問題 ''' ? ? # 導(dǎo)入模塊(模塊名.py,包名init.py) import threading import time ? ? def task1(count): ? ? # 獲取當(dāng)前線程對象 ? ? # 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}) ? ? # 設(shè)置守護(hù)主線程的第二種方式 ? ? # t1.setDaemon(True) ? ? t2.setDaemon(True) ? ? t1.start() ? ? t1.join() ? # 阻塞函數(shù),t1執(zhí)行完畢才會向下執(zhí)行 ? ? t2.start() ? ? # t2.join() ? ? print('Main thread over')
二、補充:Python多線程共享變量資源競爭問題
- 1.資源競爭問題:sum+=1執(zhí)行時大致會分為三步(取值、加1、寫回),可能剛執(zhí)行2步cpu就去切換到了另一個線程去執(zhí)行;
- 2.解決辦法:1.使用join()方法來設(shè)置線程同步(效率不高),2.加鎖(可以保證同一時刻只有一個線程在執(zhí)行) 。
''' 資源競爭問題:sum+=1執(zhí)行時大致會分為三步(取值、加1、寫回),可能剛執(zhí)行2步cpu就去切換到了另一個線程去執(zhí)行 解決辦法:1.使用join()方法來設(shè)置線程同步(效率不高),2.加鎖(可以保證同一時刻只有一個線程在執(zhí)行) ''' ? 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}的計算結(jié)果是{sum}') ? ? def add_num2(): ? ? global sum ? ? for i in range(1000000): ? ? ? ? # lock.acquire() ? ? ? ? sum+=1 ? ? ? ? # lock.release() ? ? print(f'{threading.current_thread().name}的計算結(jié)果是{sum}') ? if __name__ == '__main__': ? ? t1=threading.Thread(target=add_num1) ? ? t2=threading.Thread(target=add_num2) ? ? t1.start() ? ? # 設(shè)置阻塞函數(shù),設(shè)置線程同步 ? ? t1.join() ? ? t2.start() ? ? print(f'Main的sum值是{sum}')
到此這篇關(guān)于Python多線程的使用詳情的文章就介紹到這了,更多相關(guān)Python多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python PyAutoGUI 模擬鼠標(biāo)鍵盤操作和截屏功能
一款跨平臺/無依賴的自動化測試工具,目測只能控制鼠標(biāo)/鍵盤/獲取屏幕尺寸/彈出消息框/截屏。這篇文章主要介紹了python PyAutoGUI 模擬鼠標(biāo)鍵盤操作和截屏功能,需要的朋友可以參考下2019-08-08Python GUI編程學(xué)習(xí)筆記之tkinter界面布局顯示詳解
這篇文章主要介紹了Python GUI編程學(xué)習(xí)筆記之tkinter界面布局顯示,結(jié)合實例形式分析了Python GUI編程中tkinter界面布局顯示的相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2020-03-03Python開發(fā)工具Pycharm的安裝以及使用步驟總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python開發(fā)工具的安裝以及使用的相關(guān)知識,文章圍繞著如何使用和安裝Pycharm展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Python天氣預(yù)報采集器實現(xiàn)代碼(網(wǎng)頁爬蟲)
這個天氣預(yù)報采集是從中國天氣網(wǎng)提取廣東省內(nèi)主要城市的天氣并回顯。本來是打算采集騰訊天氣的,但是貌似它的數(shù)據(jù)是用js寫上去還是什么的,得到的html文本中不包含數(shù)據(jù),所以就算了2012-10-10python?DataFrame中stack()方法、unstack()方法和pivot()方法淺析
這篇文章主要給大家介紹了關(guān)于python?DataFrame中stack()方法、unstack()方法和pivot()方法的相關(guān)資料,pandas中這三種方法都是用來對表格進(jìn)行重排的,其中stack()是unstack()的逆操作,需要的朋友可以參考下2022-04-04