Python有專(zhuān)門(mén)的線程模型.在Python中我們主要是通過(guò)thread和 threading這兩個(gè)模塊來(lái)實(shí)現(xiàn)的放可,其中Python的threading模塊是對(duì)thread做了一些包裝的鲫骗,可以更加方便的被使用莽囤,所以我們使用 threading模塊實(shí)現(xiàn)多線程編程蚯瞧。
實(shí)現(xiàn)模塊:
thread:多線程的底層支持模塊,一般不建議使用泽台;
threading:對(duì)thread進(jìn)行了封裝邓萨,將一些線程的操作對(duì)象化
threading模塊:
Thread 線程類(lèi)蔗蹋,這是我們用的最多的一個(gè)類(lèi),你可以指定線程函數(shù)執(zhí)行或者繼承自它都可以實(shí)現(xiàn)子線程功能蛇券;
Timer與Thread類(lèi)似缀壤,但要等待一段時(shí)間后才開(kāi)始運(yùn)行樊拓;
Lock 鎖原語(yǔ),這個(gè)我們可以對(duì)全局變量互斥時(shí)使用塘慕;
RLock 可重入鎖筋夏,使單線程可以再次獲得已經(jīng)獲得的鎖;
Condition 條件變量图呢,能讓一個(gè)線程停下來(lái)条篷,等待其他線程滿足某個(gè)“條件”;
Event 通用的條件變量蛤织。多個(gè)線程可以等待某個(gè)事件發(fā)生赴叹,在事件發(fā)生后,所有的線程都被激活指蚜;
Semaphore為等待鎖的線程提供一個(gè)類(lèi)似“等候室”的結(jié)構(gòu)乞巧;
BoundedSemaphore 與semaphore類(lèi)似,但不允許超過(guò)初始值摊鸡;
Queue:實(shí)現(xiàn)了多生產(chǎn)者(Producer)摊欠、多消費(fèi)者(Consumer)的隊(duì)列,支持鎖原語(yǔ)柱宦,能夠在多個(gè)線程之間提供很好的同步支持。
其中Thread類(lèi):是主要的線程類(lèi)播瞳,可以創(chuàng)建進(jìn)程實(shí)例掸刊。該類(lèi)提供的函數(shù)包括:
Thread()創(chuàng)建線程
getName(self) 返回線程的名字
isAlive(self) 布爾標(biāo)志,表示這個(gè)線程是否還在運(yùn)行中
isDaemon(self) 返回線程的daemon標(biāo)志
join(self, timeout=None) 程序掛起赢乓,直到線程結(jié)束忧侧,如果給出timeout,則最多阻塞timeout秒
run(self) 定義線程的功能函數(shù)
setDaemon(self, daemonic) 把線程的daemon標(biāo)志設(shè)為daemonic
setName(self, name) 設(shè)置線程的名字
start(self) 開(kāi)始線程執(zhí)行
其中Queue提供的類(lèi):
Queue隊(duì)列
LifoQueue后入先出(LIFO)隊(duì)列
PriorityQueue 優(yōu)先隊(duì)列
多線程threading的簡(jiǎn)單使用:
定義方法(不同的線程需要執(zhí)行)->創(chuàng)建數(shù)組牌芋,用來(lái)放不同的線程 ->創(chuàng)建線程蚓炬,并添加到數(shù)組中->運(yùn)行線程,start()
以下是示例代碼.py
# coding=utf-8
import threading
import time
### threading 的簡(jiǎn)單使用躺屁。
def method1(n):
temp=str(time.asctime())
#print n
print('這是method1運(yùn)行的時(shí)間:'+temp)
def method2():
temp = str(time.asctime())
time.sleep(3)
print('這是method2運(yùn)行的時(shí)間:' + temp)
time.sleep(3)
print('method2延時(shí)3s運(yùn)行結(jié)束')
threads=[] #創(chuàng)建threads數(shù)組
##創(chuàng)建線程使用threading.Thread()方法肯夏,target=方法名,args=調(diào)用方法的參數(shù)犀暑,沒(méi)有可none驯击,但args要是()
t1=threading.Thread(target=method1,args=('h',))
t2=threading.Thread(target=method2,)
##將單個(gè)線程添加到threads數(shù)組中
threads.append(t1)
threads.append(t2)
## 遍歷threads數(shù)組中的元素,耐亏。start()開(kāi)始執(zhí)行線程
for i in threads:
'''
setDaemon()方法是將線程聲明為守護(hù)線程徊都,必須在start()方法之前進(jìn)行設(shè)置,如果不設(shè)置為守護(hù)線程會(huì)被無(wú)限掛起广辰;
子線程如啟動(dòng)后暇矫,父線程也繼續(xù)執(zhí)行下去主之,當(dāng)父線程執(zhí)行完最后一條語(yǔ)句后,沒(méi)有等待子線程結(jié)束李根。同時(shí)子線程也結(jié)束了槽奕。
'''
#i.setDaemon(True) #ture,父線程結(jié)束和子線程同時(shí)結(jié)束
#不設(shè)置朱巨,則主線程all over結(jié)束之后史翘,還會(huì)繼續(xù)執(zhí)行未結(jié)束的子線程。
i.start()
i.join() #join()方法在for遍歷循環(huán)之外冀续,必須等待for里的循環(huán)結(jié)束之后琼讽,才能繼續(xù)執(zhí)行主線程,即下面得代碼
print('ALL OVER')