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存放全局变量,然后把词典作为参数传递给线程函数。由于词典是可变数据对象,所以当它被传递给函数的时候,函数所使用的依然是同一个对象,相当于被多个线程所共享。

 

posted @ 2015-12-23 12:28  HarvardFly  阅读(2481)  评论(1编辑  收藏  举报