目錄python
線程與進程都是虛擬單位,目的是爲了更好的描述某種事物安全
進程:資源單位併發
線程:執行單位ui
開啓一個進程,必定會有一個線程,線程纔是真正的執行者線程
# coding=utf-8 from threading import Thread from threading import current_thread import time ''' 開啓線程方式1: ''' def task(): print(f"{current_thread().name} 線程開啓") time.sleep(1) print(f"{current_thread().name} 線程結束") if __name__ == '__main__': for i in range(3): t = Thread(target=task) t.daemon = True t.start() # 判斷子線程是否存活 print(t.is_alive()) print(t.isAlive()) print("主|") ''' 開啓線程方式2: ''' class MyThread(Thread): def run(self): print(f"{current_thread().name} 線程開啓") time.sleep(1) print(f"{current_thread().name} 線程結束") if __name__ == '__main__': t = MyThread() t.start() Thread-1 線程開啓 True True Thread-2 線程開啓 True True Thread-3 線程開啓 True True 主|
線程對象的屬性:code
current_thread().name:表示當前線程的名字
對象
t.daemon = True:線程的守護進程 跟着主線程一塊兒死掉
隊列
t.is_alive() or t.isAlive():判斷子線程是否存活
進程
t.join():等待子線程結束
內存
節省內存資源
開啓進程:會開闢一個名稱空間,每開啓一個進程都會佔用一分內存資源
,會自帶一個線程
開啓線程:一個進程能夠開啓多個線程,線程的開銷遠小於進程
注意:進程不能實現並行,線程只能實現併發,進程能夠實現並行
比喻:內存就像一個工廠,子進程就像是一個個工廠車間,線程就像車間內的流水線
線程互斥鎖
# coding=utf-8 from threading import Thread,current_thread,Lock import time n = 100 ''' 線程中數據時共享的,若是不加鎖,那麼每一個線程搶到的資源都將是同一個,則不能保證數據的安全 ''' def task(i,mutex): print(f"線程 {current_thread().name} 啓動") global n # 添加線程互斥鎖 mutex.acquire() temp = n time.sleep(0.1) n = temp - 1 # 釋放互斥鎖 mutex.release() print(f"線程 {current_thread().name} 結束") # print(n) if __name__ == '__main__': mutex = Lock() for i in range(10): t = Thread(target=task,args=(i,mutex)) t.start() t.join() print(n) 線程 Thread-1 啓動 線程 Thread-1 結束 線程 Thread-2 啓動 線程 Thread-2 結束 線程 Thread-3 啓動 線程 Thread-3 結束 線程 Thread-4 啓動 線程 Thread-4 結束 線程 Thread-5 啓動 線程 Thread-5 結束 線程 Thread-6 啓動 線程 Thread-6 結束 線程 Thread-7 啓動 線程 Thread-7 結束 線程 Thread-8 啓動 線程 Thread-8 結束 線程 Thread-9 啓動 線程 Thread-9 結束 線程 Thread-10 啓動 線程 Thread-10 結束 90