首页 > 编程 > Python > 正文

Python多线程经典问题之乘客做公交车算法实例

2020-02-23 04:27:39
字体:
来源:转载
供稿:网友

本文实例讲述了Python多线程经典问题之乘客做公交车算法。分享给大家供大家参考,具体如下:

问题描述:

乘客乘坐公交车问题,司机,乘客,售票员协同工作,通过多线程模拟三者的工作。
司机:开车,停车
售票员:打开车门,关闭车门
乘客:上车,下车

用Python的Event做线程同步通信,代码如下:

# *-* coding:gb2312 *-*import threadingimport timestationName=("车站0","车站1","车站2","车站3","车站4","车站5","车站6")currentStationIndex = -1eventBusStop = threading.Event()eventClosedDoor = threading.Event()eventOpenedDoor = threading.Event()stationCount = len(stationName)class Passenger(threading.Thread):  def __init__(self,no,getonStation,getoffStation):    self.no =no    self.getonStation=getonStation    self.getoffStation=getoffStation    threading.Thread.__init__(self)  def run(self):    bExit= False    global currentStationIndex    global stationCount    bAlreadyGetOnStation = False    while not bExit:      eventOpenedDoor.wait()      if self.getonStation == currentStationIndex and bAlreadyGetOnStation == False:        print "乘客%d在%s上车" %(self.no,stationName[currentStationIndex])        bAlreadyGetOnStation =True      elif self.getoffStation == currentStationIndex:        print "乘客%d在%s下车" %(self.no,stationName[currentStationIndex])        bExit = True      time.sleep(1)class Driver(threading.Thread):  def run(self):    bExit= False    global currentStationIndex    global stationCount    while not bExit:      print "司机: 公交车开始行驶....."      time.sleep(5)      currentStationIndex += 1      print "司机: 到站 ",stationName[currentStationIndex]      eventBusStop.set()      eventClosedDoor.wait()      eventClosedDoor.clear()      if currentStationIndex == stationCount-1:        bExit= Trueclass Conductor(threading.Thread):  def run(self):    bExit= False    global currentStationIndex    global stationCount    while not bExit:      eventBusStop.wait()      eventBusStop.clear()      print "售票员打开车门:%s到了" %(stationName[currentStationIndex])      eventOpenedDoor.set()      time.sleep(5)      print "售票员关闭车门"      eventOpenedDoor.clear()      eventClosedDoor.set()      if currentStationIndex == stationCount-1:        bExit = Truedef test():  passPool=[]  passPool.append(Passenger(0,0,3))  passPool.append(Passenger(1,1,3))  passPool.append(Passenger(2,2,4))  passPool.append(Passenger(3,0,5))  passPool.append(Passenger(4,1,3))  passPool.append(Passenger(5,2,4))  passPool.append(Passenger(6,4,5))  passPool.append(Passenger(7,0,2))  passPool.append(Passenger(8,1,3))  passPool.append(Conductor())  passPool.append(Driver())  leng = len(passPool)  for i in range(leng):    passPool[i].start()if __name__=='__main__':  test()

输出结果如下:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表