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