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实现统计代码行数的方法
May 22 Python
Python极简代码实现杨辉三角示例代码
Nov 15 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
Dec 18 Python
使用Python操作excel文件的实例代码
Oct 15 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
python方向键控制上下左右代码
Jan 20 Python
Python中判断输入是否为数字的实现代码
May 26 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
如何在Win10系统使用Python3连接Hive
Oct 15 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编程风格规范分享
2014/01/15 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
js三种排序算法分享
2012/08/16 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
常用的javascript设计模式
2017/01/11 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
解析Python编程中的包结构
2015/10/25 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
家长会演讲稿范文
2014/01/10 职场文书
护理专科毕业生自荐书范文
2014/02/19 职场文书
青春寄语大全
2014/04/09 职场文书
停车场管理协议书范本
2014/10/08 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle