線程
- 默認(rèn)情況下汞贸,一個(gè)進(jìn)程有且只有一個(gè)線程,這個(gè)線程叫做主線程
threading 模塊中的Thread類就是線程類,這個(gè)類的對(duì)象就是線程對(duì)象叹谁,一個(gè)線程對(duì)象對(duì)應(yīng)一個(gè)子線程
(需要一個(gè)子線程就創(chuàng)建一個(gè)Thread類的對(duì)象)
# 2.在3個(gè)子線程中同時(shí)下載三個(gè)電影
"""
Tread(target, args) ---- 創(chuàng)建子線程對(duì)象(關(guān)鍵字參數(shù))
說明:
target - Function,需要傳一個(gè)函數(shù)(這個(gè)函數(shù)中的內(nèi)容會(huì)在子線程中執(zhí)行)
args - target對(duì)應(yīng)的函數(shù)參數(shù)
當(dāng)通過創(chuàng)建好的子線程對(duì)象調(diào)用start方法的時(shí)候饲梭,會(huì)自動(dòng)在子線程中條用target對(duì)應(yīng)的函數(shù)
并且將args中的值作為實(shí)參
"""
t1 = threading.Thread(target=download, args=('郭銳1.avi',))
t2 = threading.Thread(target=download, args=('郭銳3.avi',))
t3 = threading.Thread(target=download, args=('郭銳2.avi',))
# 開始執(zhí)行對(duì)應(yīng)的任務(wù)
t1.start()
t2.start()
t3.start()
print('===============================')
運(yùn)行結(jié)果:
程序開始
2019-01-17 17:33:42.673232:郭銳1.avi 開始下載
2019-01-17 17:33:42.673232:郭銳3.avi 開始下載
2019-01-17 17:33:42.673232:郭銳2.avi 開始下載
===============================
2019-01-17 17:33:52.673895:郭銳1.avi 下載完成
2019-01-17 17:33:52.674892:郭銳3.avi 下載完成
2019-01-17 17:33:52.674892:郭銳2.avi 下載完成
-
可以通過寫一個(gè)類,繼承Thread的類焰檩,來創(chuàng)建屬于自己的線程類
1.聲明類繼承Tread
2.重寫類的run方法憔涉,這個(gè)方法中的任務(wù)就是需要在子線程中執(zhí)行的任務(wù)
3.需要線程對(duì)象的時(shí)候,創(chuàng)建當(dāng)前聲明的類的對(duì)象析苫,還是通過start方法在子線程中去執(zhí)行run方法中的任務(wù)class DownloadThread(threading.Thread): """下載類""" def __init__(self, file): super().__init__() self.file = file def run(self): # print(datetime.now()) print('開始下載:' + self.file) # print('run:', threading.current_thread()) t = randint(5, 10) time.sleep(t) print(self.file + ' 下載結(jié)束', end=' ') print('耗時(shí)%d秒' % t) # print(datetime.now()) def creat_thread(): t1 = DownloadThread('電鋸驚魂') t1.start() t2 = DownloadThread('熊出沒') t2.start() t3 = DownloadThread('喜洋洋與灰太狼') t3.start() t1.join() t2.join() t3.join() print('==========下載結(jié)束============') global flag flag = False def main(): # 獲取當(dāng)前線程 # print(threading.current_thread()) # 調(diào)用start方法會(huì)自動(dòng)在子線程中調(diào)用run方法 # 注意:如果直接用對(duì)象調(diào)用run方法兜叨,會(huì)在主線程執(zhí)行 t0 = threading.Thread(target=creat_thread) t0.start() for i in range(100): time.sleep(1) print(i) if not flag: break if __name__ == '__main__': main()
join
# 線程對(duì)象調(diào)用join方法,會(huì)導(dǎo)致join后的代碼在線程中的任務(wù)結(jié)束后才執(zhí)行