多線程
1、進(jìn)程
指系統(tǒng)中正在運(yùn)行的一個(gè)引用程序叫進(jìn)程
每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專(zhuān)用且受保護(hù)的內(nèi)存空間內(nèi)。
2、線程
1個(gè)進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每1個(gè)進(jìn)程至少要有1條線程)
一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行的。
線程的特點(diǎn):
一個(gè)線程中任務(wù)的執(zhí)行是串行的。
如果要在一個(gè)線程中執(zhí)行多個(gè)任務(wù),那么只能一個(gè)一個(gè)的按順序執(zhí)行這些任務(wù)
線程是CPU地哦啊與的最新單位
進(jìn)程是CPU分配資源和調(diào)度的單位
一個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程,一個(gè)進(jìn)程中
3、多線程
1個(gè)進(jìn)程中可以開(kāi)啟多條線程,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)
多線程的原理
同一時(shí)間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行)
多線程并發(fā)執(zhí)行,其實(shí)是CPU快速的在多線程直接調(diào)度(切換)
如果CPU調(diào)度線程的時(shí)間足夠快,就造成了多線程并發(fā)執(zhí)行的假象。
import threading
import time
def download(file):
print('%s開(kāi)始下載' % file, datetime.now())
# sleep(時(shí)間) - 程序執(zhí)行到這個(gè)位置等待指定的時(shí)候再接著往后面執(zhí)行
time.sleep(10)
print('%s下載結(jié)束' % file, datetime.now())
t1 = threading.Thread(target=download, args=('槍王之王.mp4',))
# 開(kāi)始執(zhí)行t1對(duì)應(yīng)的子線程中的任務(wù)(實(shí)質(zhì)就是在子線程中調(diào)用target對(duì)應(yīng)的函數(shù))
t1.start()
說(shuō)明:
Thread(target,args) - 創(chuàng)建子線程對(duì)象
說(shuō)明:
target - Function,需要傳一個(gè)函數(shù)(這個(gè)函數(shù)中的內(nèi)容會(huì)在子線程中執(zhí)行)
args - 元祖,target對(duì)應(yīng)的函數(shù)的參數(shù)
當(dāng)通過(guò)創(chuàng)建好的子線程對(duì)象調(diào)用start方法的時(shí)候,會(huì)自動(dòng)在子線程中調(diào)用target對(duì)應(yīng)的函數(shù), 并且將args中值作為實(shí)參
線程對(duì)象調(diào)用join方法,會(huì)導(dǎo)致join后的代碼會(huì)在線程中的任務(wù)結(jié)束后才執(zhí)行
用法:線程1里面新建一個(gè)線程2,線程2執(zhí)行完,線程1收到反饋。