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