class RequestQueue(Process): def reset(self): self.queue = [] self.size = Checkable(0) self.pending = TSeries(storing=True, time_fnc=self.sim.clock.get) self.qtime = Tally() # queueing time self.stime = Tally() # service time self.rtime = Tally() # response time def put(self, io_request): self.queue.append(io_request) self.size.set(len(self.queue)) self.pending.collect(len(self.queue)) def get(self): io_request = self.queue.pop(0) self.size.set(len(self.queue)) self.pending.collect(len(self.queue)) return io_request def collect(self, io_request): # Collect indicators about a departing request. self.qtime.collect(io_request.queueing_time()) self.stime.collect(io_request.service_time()) self.rtime.collect(io_request.response_time()) def finalize(self): print "Mean queue size (weighted):", self.pending.wmean() print "Mean queueing time:", self.qtime.mean() print "Mean service time:", self.stime.mean() print "Mean responese time:", self.rtime.mean() self.plotter = Plotter() self.pending.run_chart(axes=self.plotter, label="Pending requests", legend=True)
class Queue(Process): content = None def reset(self): self.content = [] self.size = Checkable(0) self.size_tseries = TSeries(time_fnc=self.sim.clock.get, storing=True) self.size_tseries.collect(0) self.category_ftable = FTable() Consumer.waiting_time.clear() def status(self): return self.content def put(self, obj): self.content.append(obj) self.size.set(len(self.content)) self.size_tseries.collect(len(self.content)) self.category_ftable.collect(obj) def get(self): obj = self.content.pop(0) self.size.set(len(self.content)) self.size_tseries.collect(len(self.content)) return obj def finalize(self): p = self.plotter = Plotter(rows=1, cols=2) Consumer.waiting_time.histogram(axes=p, title="Consumer waiting time") self.category_ftable.pie_chart(axes=p, title="Production distribution") self.size_tseries.run_chart(axes=p, title="Queue size time series", label="Queue size", color="green", legend=True)
class VirusSim(Simulator): def reset(self): self.clock.precision = 0.5 self.members.clear() Virus.autoname_reset() for _ in xrange(Virus.initial_population): self.members.add(Virus()) self.count = TSeries(storing=True, time_fnc=self.clock.get) self.count.collect(len(self.members)) @Chain def initialize(self): # Print time if trace is disabled. if not self.stack.trace: while True: print "%10.6f: %d viruses" % (self.time, len(self.members)) yield 10 def finalize(self): axes = self.count.run_chart(label="Registered growth", title="Virus population", legend=True) self.plotter = axes.figure.plotter print "\n" + self.count.report()