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 解析XML文件
Apr 15 Python
python在指定目录下查找gif文件的方法
May 04 Python
Python缩进和冒号详解
Jun 01 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
Python socket非阻塞模块应用示例
Sep 12 Python
Python计算两个矩形重合面积代码实例
Sep 16 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
python Gabor滤波器讲解
Oct 26 Python
利用python+request通过接口实现人员通行记录上传功能
Jan 13 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 Python
全网非常详细的pytest配置文件
Jul 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中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
Python 的 with 语句详解
2014/06/13 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
学校七一活动方案
2014/01/19 职场文书
提拔干部考察材料
2014/05/26 职场文书
信息工作经验交流材料
2014/05/28 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL
在 Python 中利用 Pool 进行多线程
2022/04/24 Python