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抽象类的新写法
Jun 18 Python
python实现n个数中选出m个数的方法
Nov 13 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
Python 简单计算要求形状面积的实例
Jan 18 Python
设置jupyter中DataFrame的显示限制方式
Apr 12 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
python判断变量是否为列表的方法
Sep 17 Python
Django分页器的用法你都了解吗
May 26 Python
python自动化八大定位元素讲解
Jul 09 Python
Python闭包的定义和使用方法
Apr 11 Python
Python matplotlib绘制雷达图
Apr 13 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
JavaScript 面向对象之命名空间
2010/05/04 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
python在控制台输出进度条的方法
2015/06/20 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python实现图片拼接的代码
2018/07/02 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
python模块如何查看
2020/06/16 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
Python实现区域填充的示例代码
2021/02/03 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
人事部专员岗位职责
2014/03/04 职场文书
2014年财政工作总结
2014/12/10 职场文书
运动会跳远广播稿
2015/08/19 职场文书
六年级情感作文之500字
2019/10/23 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
centos7安装mysql5.7经验记录
2022/05/02 Servers