一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2017-07-17 编辑:简简单单 来源:一聚教程网

问题描述:

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

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

 

 代码如下复制代码

# *-* coding:gb2312 *-*

importthreading

importtime

stationName=("车站0","车站1","车站2","车站3","车站4","车站5","车站6")

currentStationIndex=-1

eventBusStop=threading.Event()

eventClosedDoor=threading.Event()

eventOpenedDoor=threading.Event()

stationCount=len(stationName)

classPassenger(threading.Thread):

  def__init__(self,no,getonStation,getoffStation):

    self.no=no

    self.getonStation=getonStation

    self.getoffStation=getoffStation

    threading.Thread.__init__(self)

  defrun(self):

    bExit=False

    globalcurrentStationIndex

    globalstationCount

    bAlreadyGetOnStation=False

    whilenotbExit:

      eventOpenedDoor.wait()

      ifself.getonStation==currentStationIndexandbAlreadyGetOnStation==False:

        print"乘客%d在%s上车"%(self.no,stationName[currentStationIndex])

        bAlreadyGetOnStation=True

      elifself.getoffStation==currentStationIndex:

        print"乘客%d在%s下车"%(self.no,stationName[currentStationIndex])

        bExit=True

      time.sleep(1)

classDriver(threading.Thread):

  defrun(self):

    bExit=False

    globalcurrentStationIndex

    globalstationCount

    whilenotbExit:

      print"司机: 公交车开始行驶....."

      time.sleep(5)

      currentStationIndex+=1

      print"司机: 到站 ",stationName[currentStationIndex]

      eventBusStop.set()

      eventClosedDoor.wait()

      eventClosedDoor.clear()

      ifcurrentStationIndex==stationCount-1:

        bExit=True

classConductor(threading.Thread):

  defrun(self):

    bExit=False

    globalcurrentStationIndex

    globalstationCount

    whilenotbExit:

      eventBusStop.wait()

      eventBusStop.clear()

      print"售票员打开车门:%s到了"%(stationName[currentStationIndex])

      eventOpenedDoor.set()

      time.sleep(5)

      print"售票员关闭车门"

      eventOpenedDoor.clear()

      eventClosedDoor.set()

      ifcurrentStationIndex==stationCount-1:

        bExit=True

deftest():

  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)

  foriinrange(leng):

    passPool[i].start()

if__name__=='__main__':

  test()

 

输出结果如下:

热门栏目