part 1 進(jìn)程
進(jìn)程 | 一個(gè)正在運(yùn)行的應(yīng)用程序 |
---|
每個(gè)進(jìn)程之間都是獨(dú)立的暂雹,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)
線程 | 進(jìn)程要想執(zhí)行任務(wù)必須有線程承匣,至少有一條線程 |
---|---|
串行 | 線程執(zhí)行任務(wù)是一個(gè)一個(gè)去執(zhí)行的擂仍,如果一個(gè)新出中執(zhí)行多個(gè)任務(wù)戴尸,那么只能一個(gè)一個(gè)去執(zhí)行。 |
多線程 | 一個(gè)進(jìn)程中可以開(kāi)啟多條線程琅捏,每天線程可以并行(同時(shí))執(zhí)行不同的任務(wù) |
耗時(shí)操作
耗時(shí)操作放到主線程里面的問(wèn)題生百。
1.會(huì)阻塞線程
2.多個(gè)耗時(shí)操作放到一個(gè)線程里去,最終執(zhí)行的時(shí)間是兩個(gè)耗時(shí)操作的時(shí)間和
part 2 多線程
import threading
import time
#python自帶多線程模塊
#所有的進(jìn)程默認(rèn)都有一個(gè)線程(一般叫做主線程)柄延,其他的線程叫子線程蚀浆。
#如果想要在進(jìn)程中添加其他的線程就創(chuàng)建線程對(duì)象,
def download(file):
print('開(kāi)始下載', file)
time.sleep(5)
print(file, '下載完成')
download('葫蘆娃')
"""target:需要在子線程中執(zhí)行的函數(shù)搜吧,
args:釣魚(yú)函數(shù)的實(shí)參列表市俊,參數(shù)類型是列表
返回值是一個(gè)線程對(duì)象
t1是子線程,調(diào)用download方法
"""
t1 = threading.Thread(target=download, args=['愛(ài)情公寓'])
t2 = threading.Thread(target=download,args=['狄仁杰'])
#2.在子線程中執(zhí)行任務(wù)
t1.start()
t2.start()
part 3多線程2
from threading import Thread
import requests
#方式2 寫(xiě)一個(gè)自己的線程類
#1.寫(xiě)一個(gè)類繼承Thread
#2.重寫(xiě)run方法滤奈,在里面規(guī)定需要在子線程中執(zhí)行的任務(wù)
#3在子線程中執(zhí)行的任務(wù)對(duì)應(yīng)的功能摆昧,如果需要參數(shù),通過(guò)類的對(duì)象屬性來(lái)傳值蜒程。
#下載數(shù)據(jù)
class DownloadThread(Thread):
#下載類
def __init__(self, file_path):
super.__init__()
self.file._path = file_path
def run(self):
"""
#run方法
#寫(xiě)在這個(gè)發(fā)方法的內(nèi)容就是在子線程中執(zhí)行的內(nèi)容
#這個(gè)方法不要直接調(diào)用
"""
response = requests.request('GET', 'http://yuting.local/shareX/Git.exe')
data = response.content
with open('./git.exe', 'wb') as f:
f.write(data)
print('下載完成')
print('=====')
t1 = DownloadThread()
#通過(guò)start間接調(diào)用run方法绅你,run方法中的任務(wù)在子線程中執(zhí)行
t1.start()
#直接調(diào)用run方法,run方法的任務(wù)在當(dāng)前線程中執(zhí)行
print('!!!')
part 4
"""
想要某個(gè)線程執(zhí)行完昭躺,執(zhí)行另外的線程
"""
from threading import Thread
import time
from random import randint
class Download(Thread):
def __init__(self,file):
#父類的init方法必須調(diào)用忌锯,否則當(dāng)前這個(gè)類創(chuàng)建的對(duì)象中就沒(méi)有新的線程
super.__init__()
self.file = file
def run(self):
print('開(kāi)始下載:%s' % self.file)
time.sleep(randint(5,10))
print('%s下載結(jié)束' % self.file)
# time.time(): 獲取當(dāng)前時(shí)間-時(shí)間戳
start_time = time.time()
t1 = Download('最強(qiáng)王者.mov')
t1.start()
t2 = Download('最爛青銅.mov')
t2.start()
print('====')
# 獲取當(dāng)前線程
"""
主線程: MainThread
子線程: Thread-數(shù)字(數(shù)字從1開(kāi)始。)
"""
print(currentThread())
# 如果一個(gè)任務(wù)想要在另外一個(gè)子線程中的任務(wù)執(zhí)行完成后再執(zhí)行领炫,就在當(dāng)前任務(wù)前用子線程對(duì)象調(diào)用join方法
# 所以join也會(huì)阻塞線程偶垮,阻塞到對(duì)應(yīng)的子線程中任務(wù)執(zhí)行完為止
t1.join()
# t2.join()
end_time = time.time()
print('總共消耗時(shí)間:%.2f' % (end_time - start_time))