Python多線程的使用詳情
一,實(shí)用方法
- 1.線程之間執(zhí)行是無序的,cpu調(diào)度哪個(gè)線程就執(zhí)行哪個(gè)線程;
- 2.主線程等待所有子線程結(jié)束后再結(jié)束,設(shè)置守護(hù)線程可以實(shí)現(xiàn)當(dāng)主線程結(jié)束時(shí)子線程立馬結(jié)束;
- 3.設(shè)置守護(hù)線程:1.
threading.Thread(daemon=True),2.線程對(duì)象.setDaemon(True); - 4.線程之間共享全局變量,存在資源競爭問題。
'''
線程之間執(zhí)行是無序的,cpu調(diào)度哪個(gè)線程就執(zhí)行哪個(gè)線程
主線程會(huì)等待所有子線程結(jié)束之后再結(jié)束,設(shè)置守護(hù)線程可以實(shí)現(xiàn)當(dāng)主線程結(jié)束時(shí)子線程立馬結(jié)束
設(shè)置守護(hù)線程:1.threading.Thread(daemon=True),2.線程對(duì)象.setDaemon(True)
線程之間共享全局變量,存在資源競爭問題
'''
?
?
# 導(dǎo)入模塊(模塊名.py,包名init.py)
import threading
import time
?
?
def task1(count):
? ? # 獲取當(dāng)前線程對(duì)象
? ? # 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í)行完畢才會(huì)向下執(zhí)行
? ? t2.start()
? ? # t2.join()
? ? print('Main thread over')二、補(bǔ)充:Python多線程共享變量資源競爭問題
- 1.資源競爭問題:sum+=1執(zhí)行時(shí)大致會(huì)分為三步(取值、加1、寫回),可能剛執(zhí)行2步cpu就去切換到了另一個(gè)線程去執(zhí)行;
- 2.解決辦法:1.使用join()方法來設(shè)置線程同步(效率不高),2.加鎖(可以保證同一時(shí)刻只有一個(gè)線程在執(zhí)行) 。
'''
資源競爭問題:sum+=1執(zhí)行時(shí)大致會(huì)分為三步(取值、加1、寫回),可能剛執(zhí)行2步cpu就去切換到了另一個(gè)線程去執(zhí)行
解決辦法:1.使用join()方法來設(shè)置線程同步(效率不高),2.加鎖(可以保證同一時(shí)刻只有一個(gè)線程在執(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}的計(jì)算結(jié)果是{sum}')
?
?
def add_num2():
? ? global sum
? ? for i in range(1000000):
? ? ? ? # lock.acquire()
? ? ? ? sum+=1
? ? ? ? # lock.release()
? ? print(f'{threading.current_thread().name}的計(jì)算結(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3中的re.findall()方法及re.compile()
這篇文章主要介紹了Python3中的re.findall()方法及re.compile(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Centos7下源碼安裝Python3 及shell 腳本自動(dòng)安裝Python3的教程
這篇文章主要介紹了Centos7下源碼安裝Python3 shell 腳本自動(dòng)安裝Python3的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python ORM框架SQLAlchemy學(xué)習(xí)筆記之映射類使用實(shí)例和Session會(huì)話介紹
這篇文章主要介紹了Python ORM框架SQLAlchemy學(xué)習(xí)筆記之映射類使用實(shí)例和Session會(huì)話介紹,需要的朋友可以參考下2014-06-06
如何使用python轉(zhuǎn)移mysql數(shù)據(jù)庫中的全部數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何使用python轉(zhuǎn)移mysql數(shù)據(jù)庫中的全部數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下2024-11-11
OpenCV學(xué)習(xí)方框?yàn)V波實(shí)現(xiàn)圖像處理代碼示例
這篇文章主要為大家介紹了OpenCV學(xué)習(xí)如何使用方框?yàn)V波實(shí)現(xiàn)對(duì)圖像處理代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
nlp自然語言處理學(xué)習(xí)CBOW模型類實(shí)現(xiàn)示例解析
這篇文章主要為大家介紹了nlp自然語言處理學(xué)習(xí)CBOW模型類實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Gradio機(jī)器學(xué)習(xí)模型快速部署工具應(yīng)用分享
這篇文章主要為大家介紹了Gradio機(jī)器學(xué)習(xí)模型快速部署工具應(yīng)用分享原文翻譯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
簡單實(shí)例帶你了解Python的編譯和執(zhí)行全過程
python 是一種解釋型的編程語言,所以不像編譯型語言那樣需要顯式的編譯過程。然而,在 Python 代碼執(zhí)行之前,它需要被解釋器轉(zhuǎn)換成字節(jié)碼,這個(gè)過程就是 Python 的編譯過程,還不知道的朋友快來看看吧2023-04-04

