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 15 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
关于python2 csv写入空白行的问题
Jun 22 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 Python
python递归法实现简易连连看小游戏
Mar 25 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
Python日志logging模块功能与用法详解
Apr 09 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 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执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
php防止sql注入简单分析
2015/03/18 PHP
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
遗传算法之Python实现代码
2017/10/10 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
文员自我评价怎么写
2013/09/19 职场文书
高中生期末评语
2014/01/28 职场文书
高三体育教学反思
2014/01/29 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
委托证明书
2014/09/17 职场文书
小学师德师风整改措施
2014/10/27 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫