1.并發和并行
并發:在邏輯上具備同時處理多個任務的能力(其實每時刻只有一個任務)
并行:物理上在同一時刻執行多個并發任務
2.線程與進程
一個進程管多個線程,一個進程至少有一個線程
python多線程是假的,因為python解釋器內置同一時間CPU只運行一個線程
import threading
import time
def foo(something):for i in range(10):print(something)time.sleep(1)
#創建線程
t1=threading.Thread(target=foo,args=("看電影",))
t2=threading.Thread(target=foo,args=("聽音樂",))
#啟動線程
t1.start()
t2.start()
3.join函數-阻塞主線程
一個主線程,2個子線程t1和t2
需要t1和t2運行結束之前,數據檢查不會運行,也就是把主線程阻塞
import threading
import time
def foo(something):for i in range(10):print(something)time.sleep(1)
#創建線程
t1=threading.Thread(target=foo,args=("數據邏輯1",))
t2=threading.Thread(target=foo,args=("數據邏輯2",))
#啟動線程
t1.start()
t2.start()
#join在子線程完成運行之前,這個子線程的父線程將一直被阻塞
t1.join()
t2.join()
print("啟動數據檢查....")
4.守護線程
消費需求滿足后,數據邏輯1和2不需要再運行了,直接退出主線程
如果沒有聲明守護線程,主線程就要等子線程全部執行完才退出
import threading
import time
def foo(something):for i in range(10):print(something)time.sleep(1)
#創建線程
t1=threading.Thread(target=foo,args=("數據邏輯1",))
t2=threading.Thread(target=foo,args=("數據邏輯2",))
#聲明守護線程,必須再start方法之前,聲明守護線程
t1.setDaemon(True)
t2.setDaemon(True)
#啟動線程
t1.start()
t2.start()
for i in range(10):print("消費數據....")time.sleep(1)
print("消費需求已經滿足了")