標籤:
摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html
以及:http://blog.chinaunix.net/uid-11131943-id-2906286.html
threading提供了一個比thread模組更高層的API來提供線程的並發性。這些線程並發運行並共用記憶體。
下面來看threading模組的具體用法:
一、Thread的使用 目標函數可以執行個體化一個Thread對象,每個Thread對象代表著一個線程,可以通過start()方法,開始運行。
這裡對使用多線程並發,和不適用多線程並發做了一個比較:
首先是不使用多線程的操作:
代碼如下:
| 123456789101112 |
#!/usr/bin/python#compare for multi threadsimport time def worker(): print "worker" time.sleep(1) return if __name__ == "__main__": for i in xrange(5): worker() |
執行結果如下:
下面是使用多線程並發的操作:
代碼如下:
| 123456789101112 |
#!/usr/bin/pythonimport threadingimport time def worker(): print "worker" time.sleep(1) return for i in xrange(5): t = threading.Thread(target=worker) t.start() |
可以明顯看出使用了多線程並發的操作,花費時間要短的很多。
二、threading.activeCount()的使用,此方法返回當前進程中線程的個數。返回的個數中包含主線程。
代碼如下:
| 1234567891011121314 |
#!/usr/bin/python#current‘s number of threadsimport threadingimport time def worker(): print "test" time.sleep(1) for i in xrange(5): t = threading.Thread(target=worker) t.start() print "current has %d threads" % (threading.activeCount() - 1) |
三、threading.enumerate()的使用。此方法返回當前運行中的Thread對象列表。
代碼如下:
| 12345678910111213141516171819202122 |
#!/usr/bin/python#test the variable threading.enumerate()import threadingimport time def worker(): print "test" time.sleep(2) threads = []for i in xrange(5): t = threading.Thread(target=worker) threads.append(t) t.start() for item in threading.enumerate(): print item print for item in threads: print item |
四、threading.setDaemon()的使用。設定後台進程。
代碼如下:
| 12345678910111213 |
#!/usr/bin/python#create a daemonimport threadingimport time def worker(): time.sleep(3) print "worker" t=threading.Thread(target=worker)t.setDaemon(True)t.start()print "haha" |
可以看出worker()方法中的列印操作並沒有顯示出來,說明已經成為後台進程。
python線程 threading.Thread 條件變數 同步線程
在用python的threading.Thread編寫多線程程式時,最簡單的就是是用鎖,為使線程之間保持同步,可以使用threading.Condition() 條件變數
思路:
1.分析哪一塊空間需要多線程讀寫,抽象出一個共用空間類,對共用空間設定讀方法(get)和寫方法(set)
2.為使讀線程和寫線程同步,可以用threading.Condition()產生一個條件,同一個條件有wait()和notify()
notifyAll()方法,wait使線程自己進入block(阻塞)狀態,一個線程的notify可以使同一個條件變數中block
的線程得到啟動並執行機會。notifyAll通知所有被阻塞的線程進入runnable狀態。
3.所有對共用空間操作的方法(read or write)都封閉在acquire()和release()中間
========以下執行個體簡單明了==================
#coding=utf-8 #file name is maker.py
import threading import random,time
class Maker(threading.Thread): def __init__(self,threadName,shareObject): threading.Thread.__init__(self,name=threadName) self.shareObject=shareObject def run(self): for x in range(1,5): time.sleep(random.randrange(1,4)) self.shareObject.set(x) print "%s threading write %d" %(threading.currentThread().getName(),x)
|
=============================================================================
#coding=utf-8 #file name is user.py
import threading import time,random
class User(threading.Thread): def __init__(self,threadName,shareObject): threading.Thread.__init__(self,name=threadName) self.shareObject=shareObject self.sum=0 def run(self): for x in range(1,5): time.sleep(random.randrange(1,4)) tempNum=self.shareObject.get() print "%s threading read %d" %(threading.currentThread().getName(),tempNum) self.sum=self.sum+tempNum def display(self): print "sum is %d" %(self.sum)
|
=============================================================================
#coding=utf-8 #file name is shareInt.py
import threading import time,random
class ShareInt(): def __init__(self): self.threadCondition=threading.Condition() self.shareObject=[] #所有對共用空間操作的方法(read or write)都封閉在acquire()和release()中間 def set(self,num): self.threadCondition.acquire() # 在調用一個讀或者寫共用空間的方法時,需要先拿到一個基本鎖 # 基本鎖的獲得採用競爭機制,無法判斷哪個線程會先運行 # 不拿基本鎖會出現執行階段錯誤:cannot notify on un-aquired lock if len(self.shareObject)!=0: print "%s threading try write! But shareObject is full" %(threading.currentThread().getName()) self.threadCondition.wait() # 在條件滿足的情況下,會block掉調用這個方法的線程 # 這裡使用while語句更好,因為block在這個位置後, # 當再次運行此線程的時候,會從頭再一次檢查條件。 self.shareObject.append(num) self.threadCondition.notify() # 一定要先調用notify()方法,在release()釋放基本鎖 self.threadCondition.release() # 可以理解為"通知"被wait的線程進入runnable狀態,然後在它獲得鎖後開始運行 # 最後一定要release()釋放鎖,否則會導致死結 def get(self): self.threadCondition.acquire() if len(self.shareObject)==0: print "%s threading try read! But shareObject is empty" %(threading.currentThread().getName()) self.threadCondition.wait() tempNum=self.shareObject[0] self.shareObject.remove(tempNum) self.threadCondition.notify() self.threadCondition.release() return tempNum
|
==============================測試代碼===============================
#coding=utf-8 #file name is Test.py
from user import User from maker import Maker from shareInt import ShareInt
shareObject=ShareInt() user1=User("user1",shareObject) maker1=Maker("maker1",shareObject)
user1.start() maker1.start()
user1.join() maker1.join()
user1.display()
print "main threading over!"
|
python中threading的用法