python - Simpy; how to incorporate an unknown amount of interrupts -


i using python , simpy simulation. in simulation 1 instance (interrupted) can interrupted (interruptor). use nested try except statements each interruption. nested try except statements work if know maximum number of interruptions.

the problem don't know how many interruptions occur (could 1,2,3, ...). don't know how handle objects interrupted unknown number of times.

the code below works 3 interruptions, breaks down if fourth interruption included (due 3 nested try except statements).

is possible make code more generic can handle unknown number of interruptions?

any appreciated.

code:

import simpy import random  class interupted(object):      def __init__(self, env):         self.env = env         self.isinterrupted = false         self.action = env.process(self.run())      def run(self):         self.isinterrupted = false         try:             print('uninterrupted @ %s' % (self.env.now))             yield self.env.timeout(3)         except simpy.interrupt interrupt:             print(interrupt.cause)             try:                 self.isinterrupted = true                 print('interrupted @ %s' % (self.env.now))                 yield self.env.timeout(10)             except simpy.interrupt interrupt:                 print(interrupt.cause)                 try:                     self.isinterrupted = true                     print('interrupted @ %s' % (self.env.now))                     yield self.env.timeout(10)                 except simpy.interrupt interrupt:                     print(interrupt.cause)                     self.isinterrupted = true                     print('interrupted @ %s' % (self.env.now))                     yield self.env.timeout(10)  class interruptor(object):      def __init__(self, env, interrupted):         self.env = env         self.interrupted = interrupted         self.action = env.process(self.run(interrupted))      def run(self, interrupted):         yield self.env.timeout(1)         interrupted.action.interrupt("first interrupt")         yield self.env.timeout(1)         interrupted.action.interrupt("second interrupt")         yield self.env.timeout(1)         interrupted.action.interrupt("third interrupt")         yield self.env.timeout(1)         interrupted.action.interrupt("fourth interrupt")  env = simpy.environment() interrupted = interupted(env) interruptor = interruptor(env, interrupted) env.run(until=15) 

output:

uninterrupted @ 0 first interrupt interrupted @ 1   second interrupt interrupted @ 2 third interrupt interrupted @ 3 traceback (most recent call last): file "interrupt.py", line 58, in <module>     env.run(until=15) file "/usr/local/lib/python2.7/dist-packages/simpy/core.py", line 137, in run     self.step() file "/usr/local/lib/python2.7/dist-packages/simpy/core.py", line 229,     in step     raise exc simpy.events.interrupt: interrupt('fourth interrupt') 

versions used:

  • python: 2.7.3
  • simpy: 3.0.7

i made progress , came solution.

multiple interrupts not require nested try except statements. separate statements seem work. after trail , error found out possible use separate try except statement.

the first interrupt starts counter. every interrupt increases counter , while loop ensures interrupts taken care of. works long except doesn't contain additional yield statement above.

code:

import simpy import random  class interupted(object):      def __init__(self, env):         self.env = env         self.isinterrupted = false         self.interruptions = 0         self.action = env.process(self.run())      def run(self):         print('start @ time %s' % (self.env.now))         try:             yield self.env.timeout(10)         except simpy.interrupt interrupt:             self.isinterrupted = not self.isinterrupted             self.interruptions += 1             print('interrupted @ time %s interrupted: %s interrupted by: %s' % (self.env.now, self.isinterrupted, interrupt.cause))         while (self.interruptions > 0):             self.interruptions = self.interruptions - 1             try:                 yield self.env.timeout(5)             except simpy.interrupt interrupt:                 self.interruptions += 1                 print('interrupted @ time %s interrupted: %s interrupted by: %s' % (self.env.now, self.isinterrupted, interrupt.cause))         print('end @ time %s' % (self.env.now))      class interruptor(object):      def __init__(self, env, interrupted):         self.env = env         self.interrupted = interrupted         self.action = env.process(self.run(interrupted))      def run(self, interrupted):         in range(16):             yield self.env.timeout(5)             if(not interrupted.action.processed):                 interrupted.action.interrupt("interrupt nr: %s" % i)  env = simpy.environment() interrupted = interupted(env) interruptor = interruptor(env, interrupted) env.run(until=100) 

Comments

Popular posts from this blog

Email notification in google apps script -

c++ - Difference between pre and post decrement in recursive function argument -

javascript - IE11 incompatibility with jQuery's 'readonly'? -