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删除指定目录下过期文件的2个脚本分享
Apr 10 Python
Python比较两个图片相似度的方法
Mar 13 Python
python使用RNN实现文本分类
May 24 Python
Python常见内置高效率函数用法示例
Jul 31 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
Python基于pillow库实现生成图片水印
Sep 14 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
Python使用pyecharts控件绘制图表
Jun 05 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基础学习之流程控制的实现分析
2013/04/28 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
网页常用特效代码整理
2006/06/23 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
大学生自荐书范文
2013/12/10 职场文书
校园自助餐厅的创业计划书
2013/12/26 职场文书
高二历史教学反思
2014/01/25 职场文书
校园文明倡议书
2014/05/16 职场文书
五好关工委申报材料
2014/05/31 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
三八妇女节慰问信
2015/02/14 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
民事代理词范文
2015/05/25 职场文书
会计专业自荐信范文
2019/05/22 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android