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 13 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
python实现红包裂变算法
Feb 16 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 Python
python操作kafka实践的示例代码
Jun 19 Python
Python跳出多重循环的方法示例
Jul 03 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 Python
python 将html转换为pdf的几种方法
Dec 29 Python
python使用glob检索文件的操作
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
APMServ使用说明
2006/10/23 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
分享PHP守护进程类
2015/12/30 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
Node.Js生成比特币地址代码解析
2018/04/21 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
python实现括号匹配的思路详解
2018/08/23 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
Android面试宝典
2013/08/06 面试题
局域网定义和特性
2016/01/23 面试题
食堂个人先进事迹
2014/01/22 职场文书
公司员工安全协议书
2014/11/21 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
教师节慰问信
2015/02/15 职场文书
少儿励志名言(80句)
2019/08/14 职场文书