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中的exec、eval使用实例
Sep 23 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
Python实现字典(dict)的迭代操作示例
Jun 05 Python
Flask-WTF表单的使用方法
Jul 12 Python
django页面跳转问题及注意事项
Jul 18 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
Python @property使用方法解析
Sep 17 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
pytorch 带batch的tensor类型图像显示操作
May 20 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基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
Python中使用SAX解析xml实例
2014/11/21 Python
从Python的源码来解析Python下的freeblock
2015/05/11 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Python内置类型性能分析过程实例
2020/01/29 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
员工激励培训演讲稿
2014/09/16 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
文明倡议书
2015/01/19 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书