日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python多線程的使用詳情_python

作者:程序員班長 ? 更新時間: 2022-06-12 編程語言

一,實用方法

  • 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

欄目分類
最近更新