Python 標准庫提供了 thread 和 threading 兩個模塊來對多線程進行支持。
其中, thread 模塊以低級、原始的方式來處理和控制線程,而 threading 模塊通過對 thread 進行二次封裝,提供了更方便的 api 來處理線程。
雖然使用 thread 沒有 threading 來的方便,但它更靈活。初學者先從thread模板開始學習
thread.start_new_thread ( function , args [ , kwargs ] )
函數將創建一個新的線程,並返回該線程的標識符(標識符為整數)。參數 function 表示線程創建之後,立即執行的函數,參數 args 是該函數的參數,它是一個元組類型;第二個參數 kwargs 是可選的,它為函數提供了命名參數字典。函數執行完畢之後,線程將自動退出。如果函數在執行過程中遇到未處理的異常,該線程將退出,但不會影響其他線程的執行
import thread, time count = 0 def threadOne(): global count for i in xrange(10000): count += 1 for i in range(10): thread.start_new_thread(threadOne, ()) #後台開啟一個新的線程 time.sleep(3)#沒有sleep 有時候會報錯,python機制要求必須加上sleep print count #count是多少呢?是10000 * 10 嗎? #output# 32285
為什麼會出現這樣的結果呢,因為count是全局變量,我們開啟了10個線程,是對count進行了並發操作。
全局變量 count 是共享資源,對它的操作應該串行的進行,所以下面我們給他加上鎖
import thread, time count = 0 lock = thread.allocate_lock() #創建一個瑣對象 def threadOne(): global count, lock lock.acquire() #獲取瑣 for i in xrange(10000): count += 1 lock.release() #釋放瑣 for i in xrange(10): thread.start_new_thread(threadOne, ()) time.sleep(3) print count #output# 100000
thread.LockType 是 thread 模塊中定義的瑣類型。它有如下方法:
lock.acquire ( [ waitflag ] )
獲取瑣。函數返回一個布爾值,如果獲取成功,返回 True ,否則返回 False 。參數 waitflag 的默認值是一個非零整數,表示如果瑣已經被其他線程占用,那麼當前線程將一直等待,只到其他線程釋放,然後獲取訪瑣。如果將參數 waitflag 置為 0 ,那麼當前線程會嘗試獲取瑣,不管瑣是否被其他線程占用,當前線程都不會等待
lock.release ()
釋放所占用的瑣
lock.locked ()
判斷瑣是否被占用。