每個(gè)進(jìn)程默認(rèn)有一個(gè)主線程,其它的都叫子線程 需要子線程就創(chuàng)建這個(gè)類(需要導(dǎo)入threading模塊 Thread)的對象
def download(filenames):
print('開始下載:%s'%filenames,datetime.now())
time.sleep(3)
print('%s下載完成'%filenames,datetime.now())
單線程 在一個(gè)線程中下載兩個(gè)電影 耗時(shí)10s
download('阿凡達(dá)')
download('阿凡達(dá)2')
# threading.current_thread() - 獲取當(dāng)前線程
print(threading.current_thread())
3.Thread類
Thread類的對象就是線程佩脊,需要子線程就創(chuàng)建
這個(gè)類的對象
Thread(target,args岭粤,kwargs)
target - 函數(shù)星著,需要在當(dāng)前創(chuàng)建的子線程中去調(diào)用的函數(shù)
args/kwargs - 給target調(diào)用的函數(shù)傳參
# a.創(chuàng)建線程對象
t1 = threading.Thread(target=download,args=('阿凡達(dá)',))
t2 = threading.Thread(target=download,args=('008',))
# b.開始執(zhí)行子線程中的任務(wù)
線程對象.start()
通過strat()方法,調(diào)用target對應(yīng)的函數(shù)
t1.start(),t2.start()
1.創(chuàng)建自己的線程類
1.聲明一個(gè)類繼承Thread
2.實(shí)現(xiàn)run方法则剃,這個(gè)方法中的任務(wù)就是需要在子線程中執(zhí)行的任務(wù)
class DownloadThread(Thread):
def __init__(self,filesname):
super().__init__()
self.filename=filesname
def run(self):
print('開始下載:%s'%self.filename,datetime.now())
time.sleep(3)
print('%s下載完成'%self.filename,datetime.now())
t1 = DownloadThread('復(fù)聯(lián)4')
t2 = DownloadThread('長江')
t2.start()
t1.start() # 在子線程中執(zhí)行
# t1.run() # 對象方法耘柱,可以調(diào)用,但是在主線程中執(zhí)行棍现,創(chuàng)建子線程對象就沒有意義了
如果一個(gè)進(jìn)程中有多個(gè)線程调煎,程序會在所有的線程都結(jié)束
后才結(jié)束
發(fā)生異常崩潰的是線程,而不是進(jìn)程
t2=DownT('盜夢空間')
t3=DownT('恐怖游輪')
t2.start()
線程對象.join()
如果希望第二個(gè)線程在第一個(gè)線程結(jié)束后才執(zhí)行己肮,就把第二個(gè)線程
放在第一個(gè)線程對象.join()后面
t2.join()
t3.start()
t3.join()
print('ok')
鎖的使用:
1.問題
當(dāng)多個(gè)線程同時(shí)對一個(gè)數(shù)據(jù)進(jìn)行讀寫操作士袄,可能會出現(xiàn)一個(gè)線程剛把數(shù)據(jù)讀出來還沒來得及寫進(jìn)去,另外一個(gè)線程進(jìn)行讀操作的數(shù)據(jù)安全問題谎僻。
(多個(gè)人上一個(gè)廁所娄柳,一個(gè)人進(jìn)去了還沒出來,另外一個(gè)人又進(jìn)去的問題)
2.解決 - 加鎖
1)保證每個(gè)數(shù)據(jù)對應(yīng)一個(gè)鎖對象
2)操作數(shù)據(jù)前加鎖艘绍,數(shù)據(jù)操作完成后釋放鎖
share_data = 1000
lock = Lock()
def add_data(value):
lock.acquire()
global share_data
old_data = share_data
time.sleep(4)
share_data = old_data + value
lock.release()
t1 = Thread(target=add_data, args=(200,))
t2 = Thread(target=add_data, args=(300,))
t1.start()
t2.start()
t1.join()
t2.join()
print(share_data)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者