您的位置:首页 > 编程语言 > Python开发

python 以面向对象的方式创建线程 实现售票系统

2015-12-23 12:28 871 查看
---恢复内容开始---

转载或借鉴请注明转自/article/5235033.html 谢谢!

通过面向对象的方法实现多线程,其核心是继承threading.Thread类。我们自己定义了一个类BoothThread, 这个类继承自thread.Threading类,通过修改Thread类的[b]run()方法来定义线程所要执行的命令。[/b]

import threading   # Python主要通过标准库中的threading包来实现多线程
import time
import os

#作为间隔  每次调用间隔0.5s
def doChore():
time.sleep(0.5)

# 定义一个类BoothThread继承自thread.Threading类
class BoothThread(threading.Thread):
def __init__(self, tid, monitor):
self.tid          = tid
self.monitor = monitor
threading.Thread.__init__(self)
def run(self):
while True:
monitor['lock'].acquire()                          # 调用lock.acquire()   加锁
if monitor['tick'] != 0:
monitor['tick'] = monitor['tick'] - 1          # 售票 售出一张减少一张
print(self.tid,':now left:',monitor['tick'])   # 剩下的票数
doChore()
else:
print("Thread_id",self.tid," No more tickets")
os._exit(0)                                    # 票售完   退出程序
monitor['lock'].release()                          # 释放锁
doChore()

monitor = {'tick':20, 'lock':threading.Lock()}   # 初始化票数

# 总共设置了10个线程
for k in range(10):
new_thread = BoothThread(k, monitor)     # 创建线程; Python使用threading.Thread对象来代表线程    类BoothThread继承自thread.Threading类
new_thread.start()     # 调用start()方法启动线程




这里使用了一个词典 monitor存放全局变量,然后把词典作为参数传递给线程函数。由于词典是可变数据对象,所以当它被传递给函数的时候,函数所使用的依然是同一个对象,相当于被多个线程所共享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: