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


Posted in Python onMarch 22, 2017

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

问题描述:

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

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

# *-* coding:gb2312 *-*
import threading
import time
stationName=("车站0","车站1","车站2","车站3","车站4","车站5","车站6")
currentStationIndex = -1
eventBusStop = 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= True
class 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 = True
def 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()

输出结果如下:

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python性能优化的20条建议
Oct 25 Python
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
python中global用法实例分析
Apr 30 Python
在Django的视图中使用数据库查询的方法
Jul 16 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
python实现简单的购物程序代码实例
Mar 03 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
详解python爬取弹幕与数据分析
Nov 14 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 #Python
python条件变量之生产者与消费者操作实例分析
Mar 22 #Python
Python实现遍历目录的方法【测试可用】
Mar 22 #Python
Python简单操作sqlite3的方法示例
Mar 22 #Python
Python创建xml文件示例
Mar 22 #Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 #Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 #Python
You might like
php实现发送微信模板消息的方法
2015/03/07 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
php swoft框架实例用法
2020/12/22 PHP
载入进度条 效果
2006/07/08 Javascript
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
javascript eval函数深入认识
2009/02/21 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
python实现C4.5决策树算法
2018/08/29 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
python程序 创建多线程过程详解
2019/09/23 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
python logging 日志的级别调整方式
2020/02/21 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
公司周年庆典邀请函
2014/01/12 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
支行行长岗位职责
2015/02/15 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
JavaScript文档对象模型DOM
2021/11/20 Javascript
python文件与路径操作神器 pathlib
2022/04/01 Python