day18多線程
- 每個(gè)進(jìn)程默認(rèn)有一個(gè)線程幽崩,其他的是子線程
- Thread類(lèi):創(chuàng)建線程對(duì)象:Thread(target, args,kwargs)
- target:函數(shù)呼盆,需要在當(dāng)前線程創(chuàng)建的子線程中去調(diào)用的函數(shù)
- args/kwargs:調(diào)用target中函數(shù)需要的實(shí)參列表
- 開(kāi)始執(zhí)行子線程的任務(wù):線程對(duì)象.start();通過(guò)start方法在子線程中調(diào)用target對(duì)應(yīng)的函數(shù)
- 一個(gè)進(jìn)程中如果有多個(gè)線程盾剩,程序會(huì)在所有的線程都結(jié)束的時(shí)候才結(jié)束雷激;發(fā)生異常崩潰指的是線程崩潰而不是進(jìn)程
- 創(chuàng)建線程的兩種方法:
from threading import Thread, currentThread, current_thread
import time
import datetime
# 方法一
def download(file_name):
print('%s downloading....' % file_name)
print(datetime.datetime.now())
time.sleep(5)
print('%s download ok' % file_name)
print(datetime.datetime.now())
t1 = Thread(target=download, args=('復(fù)聯(lián)',))
t2 = Thread(target=download, args=('007',))
t1.start()
t2.start()
print('主線程')
# 方法二
class MyThread(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self): # 在子線程中執(zhí)行的方法
print(current_thread().getName())
for i in range(1,6):
t = MyThread('線程%s' % i)
t.start()
- 子線程崩潰不會(huì)影響主線程或者其他子線程的執(zhí)行
- join()方法:如果希望某個(gè)任務(wù)是在某個(gè)線程結(jié)束后才執(zhí)行替蔬,那就將這個(gè)任務(wù)的代碼放在對(duì)應(yīng)線程對(duì)象調(diào)用join方法的后面
- 線程鎖:from threading import Lock;當(dāng)多個(gè)線程對(duì)同一個(gè)數(shù)據(jù)進(jìn)行操作時(shí),需要使用線程鎖來(lái)保證這個(gè)數(shù)據(jù)的安全
from threading import Lock
mutex = Lock()
mutex.acquire() # 加鎖
mutex.release() # 解鎖
# 1.保證每個(gè)數(shù)據(jù)對(duì)應(yīng)一個(gè)鎖對(duì)象
# 2.操作數(shù)據(jù)前加鎖屎暇,數(shù)據(jù)操作完成后釋放鎖