各位用户为了找寻关于Python多线程经典问题之乘客做公交车算法实例的资料费劲了很多周折。这里教程网为您整理了关于Python多线程经典问题之乘客做公交车算法实例的相关资料,仅供查阅,以下为您介绍关于Python多线程经典问题之乘客做公交车算法实例的详细内容
本文实例讲述了Python多线程经典问题之乘客做公交车算法。分享给大家供大家参考,具体如下:
问题描述:
乘客乘坐公交车问题,司机,乘客,售票员协同工作,通过多线程模拟三者的工作。 司机:开车,停车 售票员:打开车门,关闭车门 乘客:上车,下车
用Python的Event做线程同步通信,代码如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78# *-* 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程序设计有所帮助。