---恢復內容開始---
轉載或借鑒請注明轉自http://www.cnblogs.com/FG123/p/5068556.html 謝謝!
通過面向對象的方法實現多線程,其核心是繼承threading.Thread類。我們自己定義了一個類BoothThread, 這個類繼承自thread.Threading類,通過修改Thread類的run()方法來定義線程所要執行的命令。
1 import threading # Python主要通過標准庫中的threading包來實現多線程 2 import time 3 import os 4 5 #作為間隔 每次調用間隔0.5s 6 def doChore(): 7 time.sleep(0.5) 8 9 # 定義一個類BoothThread繼承自thread.Threading類 10 class BoothThread(threading.Thread): 11 def __init__(self, tid, monitor): 12 self.tid = tid 13 self.monitor = monitor 14 threading.Thread.__init__(self) 15 def run(self): 16 while True: 17 monitor['lock'].acquire() # 調用lock.acquire() 加鎖 18 if monitor['tick'] != 0: 19 monitor['tick'] = monitor['tick'] - 1 # 售票 售出一張減少一張 20 print(self.tid,':now left:',monitor['tick']) # 剩下的票數 21 doChore() 22 else: 23 print("Thread_id",self.tid," No more tickets") 24 os._exit(0) # 票售完 退出程序 25 monitor['lock'].release() # 釋放鎖 26 doChore() 27 28 29 monitor = {'tick':20, 'lock':threading.Lock()} # 初始化票數 30 31 # 總共設置了10個線程 32 for k in range(10): 33 new_thread = BoothThread(k, monitor) # 創建線程; Python使用threading.Thread對象來代表線程 類BoothThread繼承自thread.Threading類 34 new_thread.start() # 調用start()方法啟動線程

這里使用了一個詞典 monitor存放全局變量,然后把詞典作為參數傳遞給線程函數。由於詞典是可變數據對象,所以當它被傳遞給函數的時候,函數所使用的依然是同一個對象,相當於被多個線程所共享。
