python中的多線程
基本操作
創(chuàng)建線程:
方式一:
使用_thread模塊直接開啟一個(gè)線程
import _thread
_thread.start_new_thread()
方式二:
繼承一個(gè)線程類(可以自定義該線程類管搪,繼承threading.Thread)
import threading
class my_thread(threading.Thread):
def __init__(self[,…]):
pass
def run(self):
pass
thread1=my_thread([,…])
thread1.start()
方式三:
使用threading.Thread
import threading
thread=threading.Thread(target=f())
thread.setDaemon(True)##默認(rèn)為False
thread.start()
構(gòu)造方法threading.Thread()
Thread(group=None, target=None, name=None, args=(), kwargs={})
group: 線程組娜睛,目前還沒有實(shí)現(xiàn),庫引用中提示必須是None澎迎;
target: 要執(zhí)行的方法;
name: 線程名甫煞;
args/kwargs: 要傳入方法的參數(shù)来颤。
實(shí)例方法
isAlive(): 返回線程是否在運(yùn)行。正在運(yùn)行指啟動后囤躁、終止前玖翅。
get/setName(name): 獲取/設(shè)置線程名。
start(): 線程準(zhǔn)備就緒割以,等待CPU調(diào)度
is/setDaemon(bool): 獲取/設(shè)置是后臺線程(默認(rèn)前臺線程(False))。(在start之前設(shè)置)
start(): 啟動線程应媚。
join([timeout]): 阻塞當(dāng)前上下文環(huán)境的線程严沥,直到調(diào)用此方法的線程終止或到達(dá)指定的timeout(可選參數(shù))
Daemon(守護(hù))
設(shè)置Daemon屬性為True的線程為主線程的守護(hù)線程。
顧名思義中姜,即將該線程設(shè)置為主線程所守護(hù)的寶寶線程(xd)
在腳本運(yùn)行過程消玄,主線程中創(chuàng)建了子線程,當(dāng)主線程結(jié)束時(shí)根據(jù)子線程daemon屬性值的不同可能會發(fā)生下面的兩種情況之一:
若某個(gè)子線程的daemon屬性為False丢胚,主線程結(jié)束時(shí)會檢測該子線程是否結(jié)束翩瓜,如果該子線程還在運(yùn)行,則主線程會等待它完成后再退出携龟;
若某個(gè)子線程的daemon屬性為True兔跌,主線程會在結(jié)束后時(shí)同時(shí)將該子線程也結(jié)束掉,不論該子線程是否完成
另峡蟋。若某個(gè)子線程的屬性為False坟桅,則只有子調(diào)用thread.start()之前才能設(shè)置該值
join函數(shù)
應(yīng)用場景:
當(dāng)主線程結(jié)束后华望,Daemon屬性為True的線程也會結(jié)束,然而此時(shí)可能該線程還沒有完成其任務(wù)仅乓。此時(shí)就需要join函數(shù)了
join函數(shù)的作用是使線程之間同步
for thread in threads:
thread.join()
這樣設(shè)置之后赖舟,主線程結(jié)束之后,會等待被join的線程結(jié)束夸楣,再退出程序