最近在学数据结构,在队列那一节看到一个模拟银行工作的程序,但不够详细。
我觉得蛮有意思就想用python编个程序模拟一下。
书中的思路主要是计算每个顾客在银行的逗留时间,但我写着写着觉得光是这样没意思,就把重点放到了多线程上。
下面是代码
import threading
from time import ctime, sleep
import random
class Bank:
def __init__(self, name="", time=70):
self.name = name
self.time = time
def opening(self):
self.counters = []
for i in range(random.randrange(2,6)):
self.counters.append(Counter(self.time))
print "Wlecome to Bank %s, we have %d counters." % (self.name, len(self.counters))
while self.time:
p = random.randrange(0,2)
print p
if p:
des = self.min_counter_index()
print ctime()
print "We have a new client, and he will go to counter %d" % des
client = Client(self.counters[des])
sleep(10)
self.time -= 10
print ctime()
def min_counter_index(self):
lengths = []
for c in self.counters:
lengths.append(c.rear-c.front)
return lengths.index(min(lengths))
class Counter:
def __init__(self, time):
self.queue = [None]*10
self.front = self.rear = 0
self.length = len(self.queue)
self.time = time
def check(self):
while self.time:
client = self.queue[self.front]
if client:
sleep(client.stay_time)
self.client_out()
print ctime()
print "A client leaved."
self.time -= client.stay_time
else:
sleep(5)
self.time -= 5
def client_in(self, client):
self.queue[self.rear] = client
self.rear += 1
def client_out(self):
self.queue.pop(self.front)
self.front += 1
class Client:
def __init__(self, counter):
self.stay_time = random.randrange(20, 60, 5)
counter.client_in(self)
def main():
bname = raw_input("Input your bank name:")
bank = Bank(bname)
bank_thread = threading.Thread(target=bank.opening(), args=())
threads = [bank_thread,]
for i in range(len(bank.counters)):
t = threading.Thread(target=bank.counters[i].check(), args=())
threads.append(t)
for i in range(len(bank.counters)+1):
threads[i].start()
for i in range(len(bank.counters)+1):
threads[i].join()
print "Time to close bank. See you next time."
if __name__ == "__main__":
main()
可是写好后运行了10多次,一直都是Bank.opening()先运行,运行结束后Counter.check()才开始运行,而且只有第一个counter在不停地sleep(5),估计也是要这个counter结束了才轮到下一个counter。
我按书上编的多线程程序运行了几遍都没问题,就是上面的程序一直不行。
我的python版本是Python 2.7.3, win7系统。
请大神们帮帮忙,指点一下我这个菜鸟吧。