1.多線程
"""
每個(gè)程序在運(yùn)行的時(shí)候(進(jìn)程)系統(tǒng)都會為這個(gè)進(jìn)程創(chuàng)建一個(gè)線程离斩,這個(gè)線程我們叫主線程。
程序員自己創(chuàng)建的線程叫子線程
多個(gè)任務(wù)在一個(gè)線程中是按順序一個(gè)一個(gè)執(zhí)行的(線程的串行)
多個(gè)線程的任務(wù)同時(shí)執(zhí)行
"""
import time
import datetime
from random import randint
import threading
def download(file):
print(file,threading.current_thread())
print(datetime.datetime.now(),'開始下載:%s' % file)
# sleep(時(shí)間): 會將當(dāng)前線程阻塞指定的時(shí)間(停指定的時(shí)間然后再往后執(zhí)行)
# 時(shí)間單位:秒
time1 = randint(5, 10)
time.sleep(time1)
print(datetime.datetime.now(),'下載%s結(jié)束'%file,'總共耗時(shí):%d' % time1)
"""
python通過threading標(biāo)準(zhǔn)庫來支持多線程
"""
if name == 'main':
# download('肖生克的救贖')
# current_thread()獲取當(dāng)前線程
print(threading.current_thread())
# 1.創(chuàng)建一個(gè)線程對象
"""
Thread(target=, args=)
target: 需要傳一個(gè)需要在子線程中執(zhí)行的函數(shù)(類型是function的變量)
agrs: 在子線程中調(diào)用target對應(yīng)的函數(shù)的時(shí)候但金,該傳什么參數(shù)。類型是元祖
"""
t1 = threading.Thread(target=download, args=('阿甘正傳',))
t2 = threading.Thread(target=download, args=('肖生克的救贖',))
# 2.讓子線程去執(zhí)行任務(wù)
t1.start()
t2.start()
print('===========')
2.創(chuàng)造多線程
from threading import Thread,current_thread
import time
from datetime import datetime
"""
創(chuàng)建線程方式1:
直接通過Thread類創(chuàng)建對象,將需要在子線程中執(zhí)行的函數(shù)作為target參數(shù)傳進(jìn)去
創(chuàng)建線程方式2:
a.寫一個(gè)自己的類去繼承Thread類
b.重寫當(dāng)前類的run方法,run中的任務(wù)就是在子線程中執(zhí)行的任務(wù)
c.創(chuàng)建當(dāng)前類的對象, 就是線程對象场晶。然后調(diào)用start去執(zhí)行線程中任務(wù)
"""
1.創(chuàng)建線程類
class DownLoadThread(Thread):
"""下載線程類"""
def __init__(self, file):
super().__init__()
self.file = file
def run(self):
# 注意:如果需要給run方法中傳數(shù)據(jù),通過當(dāng)前類的屬性來傳
print('%s開始下載:' % self.file, datetime.now())
time.sleep(5)
print('%s下載結(jié)束:' % self.file, datetime.now())
2.創(chuàng)建線程對象
t1 = DownLoadThread('阿甘正傳')
t2 = DownLoadThread('沉默的羔羊')
3.通過start去執(zhí)行run中的任務(wù)
"""
注意: 如果直接調(diào)用run方法怠缸,run方法中的任務(wù)不會在當(dāng)前的子線程中執(zhí)行
"""
t1.run()
t1.start()
t2.start()