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 09 Python
Python根据区号生成手机号码的方法
Jul 08 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
Python面向对象之继承代码详解
Jan 29 Python
使用matplotlib画散点图的方法
May 25 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
破解安装Pycharm的方法
Oct 19 Python
对python中矩阵相加函数sum()的使用详解
Jan 28 Python
Python socket模块实现的udp通信功能示例
Apr 10 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 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的FTP学习(二)
2006/10/09 PHP
php array的学习笔记
2012/05/16 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
JavaScript高级程序设计 事件学习笔记
2011/09/10 Javascript
js闭包实例汇总
2014/11/09 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
python基础教程之循环介绍
2014/08/29 Python
Python中使用PIPE操作Linux管道
2015/02/04 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
python使用matplotlib绘制热图
2018/11/07 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
简单了解python的内存管理机制
2019/07/08 Python
python logging设置level失败的解决方法
2020/02/19 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
化学教育专业自荐信
2014/07/04 职场文书
捐款仪式主持词
2015/07/04 职场文书
会计岗位工作总结
2015/08/12 职场文书