程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> Python模塊學習之thread多線程處理

Python模塊學習之thread多線程處理

編輯:Python

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 ()
  判斷瑣是否被占用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved