本文实例讲述了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程序设计有所帮助。