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中exit、return、sys.exit()等使用实例和区别
May 28 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python3中简单的文件操作及两个简单小实例分享
Jun 18 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
Jun 09 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
NumPy 数组使用大全
Apr 25 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
Python中Yield的基本用法
Oct 18 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
Dec 28 Python
Django权限控制的使用
Jan 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 Token(令牌)设计
2008/03/15 PHP
php笔记之常用文件操作
2010/10/12 PHP
php调用shell的方法
2014/11/05 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
深入理解javascript动态插入技术
2013/11/12 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
使用Angular CLI生成路由的方法
2018/03/24 Javascript
python多进程操作实例
2014/11/21 Python
浅谈Python基础之I/O模型
2017/05/11 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
Python笔试面试题小结
2019/09/07 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
Python列表如何更新值
2020/05/27 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
体育专业个人的求职信范文
2013/09/21 职场文书
银行演讲稿范文
2014/01/03 职场文书
家具促销活动方案
2014/02/16 职场文书
服装发布会策划方案
2014/05/22 职场文书
单位工作证明格式模板
2014/10/04 职场文书
工作经历证明书范文
2014/11/02 职场文书
校车司机安全责任书
2015/05/11 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python