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通过zlib实现压缩与解压字符串的方法
Nov 19 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
20招让你的Python飞起来!
Sep 27 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
python之yield和Generator深入解析
Sep 18 Python
python中对_init_的理解及实例解析
Oct 11 Python
Python return语句如何实现结果返回调用
Oct 15 Python
python 调整图片亮度的示例
Dec 03 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 Python
Python数据可视化之绘制柱状图和条形图
May 25 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版)
2006/10/09 PHP
php简单日历函数
2015/10/28 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
orm获取关联表里的属性值
2016/04/17 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
JavaScript 程序编码规范
2010/11/23 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
澳洲的服装老品牌:SABA
2018/02/06 全球购物
幼儿园义卖活动方案
2014/01/17 职场文书
庆祝教师节活动方案
2014/01/31 职场文书
小学社会实践活动总结
2014/07/03 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技