python 以面向對象的方式創建線程 實現售票系統


---恢復內容開始---

轉載或借鑒請注明轉自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存放全局變量,然后把詞典作為參數傳遞給線程函數。由於詞典是可變數據對象,所以當它被傳遞給函數的時候,函數所使用的依然是同一個對象,相當於被多個線程所共享。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM