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安装路径以及安装包路径小技巧
Apr 28 Python
简单介绍Python下自己编写web框架的一些要点
Apr 29 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
用Python写一段用户登录的程序代码
Apr 22 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
matplotlib实现区域颜色填充
Mar 18 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
python使用布隆过滤器的实现示例
Aug 20 Python
python在linux环境下安装skimage的示例代码
Oct 14 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 IP及IP段进行访问限制的代码
2008/12/17 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
详解js闭包
2014/09/02 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
房屋租赁协议书
2014/04/10 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
婚内房产协议书范本
2014/10/02 职场文书
工程部主管岗位职责
2015/02/12 职场文书
毕业论文答辩开场白
2015/05/27 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
mysql创建存储过程及函数详解
2021/12/04 MySQL