python库(2)—— threading
python 多線(xiàn)程受制于Global Interpreter Lock(GIL)并不能充分利用多處理器,僅僅是多線(xiàn)程同步使用一個(gè)處理器,因此該模塊適用于I/O為主的程序。
1. Thread對(duì)象
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
使用上面函數(shù)創(chuàng)建一個(gè)新的Thread實(shí)例。
target:即線(xiàn)程的目標(biāo)函數(shù),線(xiàn)程啟動(dòng)時(shí),run()方法將調(diào)用此函數(shù)。
name:線(xiàn)程的名字,是一個(gè)字符串;默認(rèn)將創(chuàng)建一個(gè)“Thread-N”格式的唯一名稱(chēng)。
args:傳遞給target函數(shù)的參數(shù)元組;注意,必須是元組,因此注意僅有一個(gè)參數(shù)時(shí)的情況。
Thread實(shí)例t支持以下方法和屬性:
(1) t.start()
通過(guò)在一個(gè)單獨(dú)的控制線(xiàn)程中調(diào)用run()方法,啟動(dòng)線(xiàn)程。此方法只能調(diào)用一次。
(2) t.run()
線(xiàn)程啟動(dòng)時(shí)將調(diào)用此方法。默認(rèn)情況,它將調(diào)用傳遞到構(gòu)造函數(shù)中的target函數(shù);除此之外,還可以在Thread子類(lèi)中重新定義此方法。
(3) t.is_alive()
如果線(xiàn)程是活動(dòng)的,返回True;否則返回False。
(4) t.name
線(xiàn)程名稱(chēng),是一個(gè)屬性。可以通過(guò)它更改或獲得線(xiàn)程的名字。
(5) t.daemon
線(xiàn)程的布爾型后臺(tái)標(biāo)志,是一個(gè)屬性。必須在調(diào)用t.start()之前設(shè)置該值。它表示該線(xiàn)程是否是以daemon的形式執(zhí)行,它的初始值繼承自創(chuàng)建它的線(xiàn)程,因此一般是False。
threading會(huì)在主線(xiàn)程執(zhí)行完畢后,檢查是否有daemon為False的子線(xiàn)程,如果有,主線(xiàn)程就wait,等待子線(xiàn)程結(jié)束,在等待期間,所有發(fā)送到主線(xiàn)程的信號(hào)也會(huì)被阻塞,因此Ctrl-C不起作用。如果子線(xiàn)程的daemon都是True,那么主線(xiàn)程執(zhí)行完畢后不會(huì)等待,整個(gè)程序(包括主線(xiàn)程和子線(xiàn)程)立即結(jié)束。
因此,比較常用的方法,就是將子線(xiàn)程的daemon設(shè)為T(mén)rue,并且在主線(xiàn)程結(jié)束前輪尋檢測(cè)。
(6) t.join([timeout])
等待線(xiàn)程t,直到t終止或出現(xiàn)超時(shí)為止。timeout是一個(gè)浮點(diǎn)數(shù),用于指定以秒為單位的超時(shí)時(shí)間。線(xiàn)程不能夠join自己,而且不能在t運(yùn)行之前就調(diào)用t.join()
當(dāng)一個(gè)線(xiàn)程調(diào)用t.join()等待時(shí),也會(huì)出現(xiàn)上文提到的wait,無(wú)法接收信號(hào),因此如果主線(xiàn)程調(diào)用t.join(),將導(dǎo)致Ctrl-C失效。
示例:
import threadingimport timedef clock(interval):print "this is subThread!"time.sleep(interval)t=theading.Thread(target=clock,args=(15,))t.daemon=Truet.start()while t.is_alive():time.sleep(1)下面的例子實(shí)現(xiàn)了同樣的功能:import threadingimport timeclass Clock(threading.Thread):def __init__(self,interval):threading.Thread.__init__(self)self.daemon=Trueself.interval=intervaldef run(self):print "this is subThread!"time.sleep(self.interval)t=Clock(15)t.start()while t.is_alive():time.sleep(1)上面的方法將線(xiàn)程定義為類(lèi),并且定義自己的__init__()方法,并且必須像上面那樣調(diào)用基類(lèi)構(gòu)造函數(shù)Thread.__init__()。除此之外,需要重寫(xiě)run()方法,作為線(xiàn)程的目標(biāo)函數(shù)。除了run()方法之外,重寫(xiě)已經(jīng)定義的其他方法會(huì)出現(xiàn)錯(cuò)誤。 ?
2. Timer對(duì)象
class threading.Timer(interval, function, args=[], kwargs={})
創(chuàng)建定時(shí)器對(duì)象,在過(guò)去interval秒時(shí)間后運(yùn)行函數(shù)function。args提供傳遞給function的參數(shù)。在調(diào)用start()方法后會(huì)啟動(dòng)定時(shí)器。
Timer對(duì)象t具有以下方法:
(1) t.start()
啟動(dòng)定時(shí)器。提供給Timer()方法的函數(shù)function將在指定的interval之后執(zhí)行。
(2) t.cancel()
如果function函數(shù)尚未執(zhí)行,取消定時(shí)器。
示例:
在等待function執(zhí)行這段期間,Ctrl-C失效
3. Lock對(duì)象
最基本的同步鎖,并不屬于某一個(gè)特定的線(xiàn)程,也就是說(shuō),一個(gè)線(xiàn)程設(shè)定的鎖可以由另一個(gè)線(xiàn)程進(jìn)行解鎖。
通過(guò)lock=threading.Lock()創(chuàng)建Lock實(shí)例:
(1) lock.acquire([blocking])
獲取鎖定,需要阻塞到鎖定釋放為止。
(2) lock.release()
釋放一個(gè)鎖定。當(dāng)鎖處于未鎖定情況時(shí),進(jìn)行解鎖會(huì)異常;允許其他進(jìn)程解鎖
4. RLock對(duì)象
同步鎖,屬于某一個(gè)特定的線(xiàn)程,也就是說(shuō),一個(gè)線(xiàn)程設(shè)定的鎖僅能由該線(xiàn)程解鎖;其他進(jìn)程若試圖解鎖會(huì)引發(fā)異常。RLock允許在同一線(xiàn)程中被多次acquire,而Lock卻不允許這種情況。注意:如果使用RLock,那么acquire和release必須成對(duì)出現(xiàn),即調(diào)用了n次acquire,必須調(diào)用n次的release才能真正釋放所占用的瑣。這條是正確的,可以開(kāi)兩個(gè)線(xiàn)程試一下!
通過(guò)rlock=threading.RLock()創(chuàng)建RLock實(shí)例:
(1) rlock.acquire([blocking])
(2) rlock.release()
5. Semaphore對(duì)象
信號(hào)量是一個(gè)基于計(jì)數(shù)器的同步原語(yǔ),每次調(diào)用acquire()方法時(shí)此計(jì)數(shù)器減1,每次調(diào)用release()方法時(shí)此計(jì)數(shù)器加1。如果計(jì)數(shù)器為0,acquire()方法將會(huì)阻塞,直到其他線(xiàn)程調(diào)用release()方法為止。
class threading.Semaphore([value])
創(chuàng)建一個(gè)新的信號(hào)量。value是計(jì)數(shù)器的初始值,如果省略此參數(shù),計(jì)數(shù)器的值將被置1.
Semaphore實(shí)例s支持以下方法。
(1) s.acquire([blocking])
獲取信號(hào)量。如果進(jìn)入時(shí)內(nèi)部計(jì)數(shù)器大于0,此方法將把它的值減1,然后立即返回。如果它的值為0,此方法將被阻塞,直到另一個(gè)線(xiàn)程調(diào)用release()方法為止。
(2) s.release()
通過(guò)將內(nèi)部計(jì)數(shù)器的值加1來(lái)釋放一個(gè)信號(hào)量。
(3) BoundedSemaphore([value])
創(chuàng)建一個(gè)新的信號(hào)機(jī)。它的工作方式與Semaphore完全相同,但是release()操作的次數(shù)不能超過(guò)acquire()操作的次數(shù)(Semaphore可能存在這樣的隱患)
6. 實(shí)用工具函數(shù)
(1) threading.active_count()
返回當(dāng)前活動(dòng)的Thread對(duì)象數(shù)量,包括主線(xiàn)程
(2) threading.current_thread()
返回當(dāng)前Thread對(duì)象,在線(xiàn)程內(nèi)部調(diào)用。
(3) threading.enumerate()
返回當(dāng)前活動(dòng)的Thread對(duì)象列表
轉(zhuǎn)載于:https://www.cnblogs.com/zhangjing327/p/3498308.html
總結(jié)
以上是生活随笔為你收集整理的python库(2)—— threading的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Lucene:QueryParser
- 下一篇: python生物数据分析_Python学