#!/usr/bin/env python

# PerSmpExample.py--illustration of usage of the PerSmp class

# single-server queue, with interarrival and service times having
# uniform distributions on (0,1) and (0,0.5), respectively

from SimPy.Simulation import *
from random import Random,uniform
import sys
from PeriodicSampling import PerSmp

class G:  # globals
   Rnd = Random(12345)
   S = None  # our one disk

class Srvr(Resource):
   def __init__(self):
      Resource.__init__(self)  
      self.QMon = Monitor()  # monitor queue lengths
      self.PrSm = PerSmp(1.0,self.QMon,self.SMonFun)
      activate(self.PrSm,self.PrSm.Run())
   def SMonFun(self):  # for PerSmp
      return len(self.waitQ)

class Job(Process):
   def __init__(self):
      Process.__init__(self)
      self.ArrivalTime = now()
   def Run(self):
      yield request,self,G.S
      yield hold,self,G.Rnd.uniform(0,0.5)
      yield release,self,G.S
   
class Arrivals(Process):
   def __init__(self):
      Process.__init__(self)  
   def Run(self):
      while 1:
         yield hold,self,G.Rnd.uniform(0,1)
         J = Job()
         activate(J,J.Run())

def main():
   initialize()
   A = Arrivals()
   activate(A,A.Run())
   G.S = Srvr()
   MaxSimtime = 10000.0
   simulate(until=MaxSimtime)
   print 'mean queue length:',G.S.QMon.mean()

if __name__ == '__main__': main()
