Pallet preparation - Preemption with restartΒΆ

SimPype features used in this example: Random variables, Resource inline customization, Pipe custom model, Log custom message properties.

The scenario of the simulation is the following:

|Urgent order| -\
                 ) -> |Worker|
|Normal order| -/

The scenario description is the same as the one in Pallet preparation - Preemption no restart. The difference resides in the fact that the worker will restart the pallet preparation from scratch if preempted. This means that the worker will not resume the pallet preparation but rather will start again the preparation from the beginning. The worker pipe model is the same while the resource model is sligthly different (it does not consider the wait message property). The difference in the code is highlighted below.

This kind of interaction is usually called preemption with restart.

The scenario is so implemented with SimPype:

import simpype
import random


# [Mandatory] Create a SimPype simulation object
sim = simpype.Simulation(id = 'pallet_restart')
# [Optional] Fix the seed used by the pseudo-random generator
sim.seed = 42
# [Optional] Configure the log directory. 
# [Default] Log are store by default in the 'current working directory/log'
sim.log.dir = 'log'
# [Optional] Disable the logging to file and print to console instead
#sim.log.file = False
#sim.log.print = True
# [Optional] Log custom message properties
sim.log.property('items')
# [Optional] Configure the path containting the models for the simulation. 
# [Default] Current working directory
sim.model.dir = 'examples/model'

# Create a generator
urgent = sim.add_generator(id = 'urgent')
# Assign an arrival time
urgent.random['arrival'] = {
	0: lambda: random.expovariate(1.0 / 3600)
}
urgent.message.property['priority'] = 'urgent'
urgent.message.property['items'] = {
	0: lambda: random.randint(1, 5)
}
# Create a generator
normal = sim.add_generator(id = 'normal')
# Assign an arrival time
normal.random['arrival'] = {
	0: lambda: random.expovariate(1.0 / 300)
}
normal.message.property['priority'] = 'normal'
normal.message.property['items'] = {
	0: lambda: random.randint(10, 30)
}

# Add a resource
worker = sim.add_resource(id = 'worker', pipe = 'p_preemption')
worker.random['service'] = {
	0: lambda: random.expovariate(1.0 / 10)
}
# Service time depends on the number of items
@simpype.resource.service(worker)
def service(self, message):
	yield self.env.timeout(message.property['items'].value * self.random['service'].value)

# Add a pipeline connecting the generator to the resource
p0 = sim.add_pipeline(urgent, worker)
p1 = sim.add_pipeline(normal, worker)

# Run until t=28800 (8 hours)
sim.run(until = 28800)

Where pipe model p_preemption is so implemented:

import simpype


class PriorityPreemption(simpype.Pipe):
	def __init__(self, sim, resource, id):
		super().__init__(sim, resource, id)		
		self.add_queue(id = 'preempted')
		self.add_queue(id = 'urgent')
		self.add_queue(id = 'normal')

	@simpype.pipe.dequeue
	def dequeue(self):
		if len(self.queue['urgent']) > 0:
			return self.queue['urgent'].pop()
		elif len(self.queue['preempted']) > 0:
			return self.queue['preempted'].pop()
		else:
			return self.queue['normal'].pop()

	@simpype.pipe.enqueue
	def enqueue(self, message):
		if message.property['priority'].value == 'urgent':
			m = self.queue['urgent'].push(message)
			
			tlist = [t for t in self.resource.task.values() if t.process.is_alive and t.message.property['priority'].value != 'urgent']
			# If the resource is busy, preempt the current task
			if len(tlist) > 0:
				#task = max(tlist, key = lambda task: task.message.property['priority'].value)
				task = tlist[0]
				task.interrupt(cause = 'preempted')
				# This if is useful only in case of preemption with no restart
				if 'wait' in task.message.property:
					task.message.property['wait'] = task.message.property['wait'].value - (task.interrupted - task.started)
				self.queue['preempted'].push(task.message)
		else:
			m = self.queue['normal'].push(message)

		return m


# Do NOT remove
pipe = lambda *args: PriorityPreemption(*args)

sim.cfg stored under the log folder contains:

Simulation Seed: 42
Simulation Time: 28800.000000000
Execution Time: 0.058570670

sim.log stored under the log folder contains:

timestamp,message,seq_num,resource,event,items
27.285721382,normal,0,worker,pipe.in,23
27.285721382,normal,0,worker,pipe.out,23
36.975335053,normal,1,worker,pipe.in,17
49.913040803,normal,0,worker,resource.serve,23
49.913040803,normal,1,worker,pipe.out,17
54.485089429,normal,1,worker,resource.serve,17
248.149993412,normal,2,worker,pipe.in,16
248.149993412,normal,2,worker,pipe.out,16
441.493859789,normal,2,worker,resource.serve,16
625.805024250,normal,3,worker,pipe.in,23
625.805024250,normal,3,worker,pipe.out,23
700.512949940,normal,4,worker,pipe.in,10
830.461026699,normal,3,worker,resource.serve,23
830.461026699,normal,4,worker,pipe.out,10
847.855816062,normal,4,worker,resource.serve,10
1127.160757415,normal,5,worker,pipe.in,23
1127.160757415,normal,5,worker,pipe.out,23
1166.027599075,normal,5,worker,resource.serve,23
1251.929283365,normal,6,worker,pipe.in,20
1251.929283365,normal,6,worker,pipe.out,20
1284.275103075,normal,7,worker,pipe.in,21
1347.512993521,normal,6,worker,resource.serve,20
1347.512993521,normal,7,worker,pipe.out,21
1541.899381582,normal,7,worker,resource.serve,21
1848.441225565,normal,8,worker,pipe.in,11
1848.441225565,normal,8,worker,pipe.out,11
1932.961092209,normal,8,worker,resource.serve,11
2240.943354699,normal,9,worker,pipe.in,22
2240.943354699,normal,9,worker,pipe.out,22
2265.566852517,normal,10,worker,pipe.in,30
2317.278253108,normal,9,worker,resource.serve,22
2317.278253108,normal,10,worker,pipe.out,30
2554.675714055,normal,11,worker,pipe.in,28
2618.740849180,normal,12,worker,pipe.in,12
2632.813111258,normal,13,worker,pipe.in,17
2910.792233711,normal,10,worker,resource.serve,30
2910.792233711,normal,11,worker,pipe.out,28
3077.745021529,normal,14,worker,pipe.in,17
3681.804460196,normal,15,worker,pipe.in,22
3779.512534186,normal,16,worker,pipe.in,30
4090.875545150,normal,11,worker,resource.serve,28
4090.875545150,normal,12,worker,pipe.out,12
4112.177708608,normal,12,worker,resource.serve,12
4112.177708608,normal,13,worker,pipe.out,17
4186.794914503,normal,13,worker,resource.serve,17
4186.794914503,normal,14,worker,pipe.out,17
4318.442414000,normal,17,worker,pipe.in,30
4340.666385782,normal,18,worker,pipe.in,30
4375.357825977,normal,14,worker,resource.serve,17
4375.357825977,normal,15,worker,pipe.out,22
4396.977101389,normal,19,worker,pipe.in,15
4583.091251682,normal,20,worker,pipe.in,18
4662.700806454,normal,15,worker,resource.serve,22
4662.700806454,normal,16,worker,pipe.out,30
4969.195980592,normal,16,worker,resource.serve,30
4969.195980592,normal,17,worker,pipe.out,30
5213.417601642,normal,17,worker,resource.serve,30
5213.417601642,normal,18,worker,pipe.out,30
5559.605238443,normal,18,worker,resource.serve,30
5559.605238443,normal,19,worker,pipe.out,15
5837.190248640,normal,19,worker,resource.serve,15
5837.190248640,normal,20,worker,pipe.out,18
5950.673162214,normal,21,worker,pipe.in,17
6106.489838444,normal,20,worker,resource.serve,18
6106.489838444,normal,21,worker,pipe.out,17
6384.438244483,normal,21,worker,resource.serve,17
6468.132158445,normal,22,worker,pipe.in,22
6468.132158445,normal,22,worker,pipe.out,22
6520.264945496,normal,22,worker,resource.serve,22
6561.618408373,normal,23,worker,pipe.in,28
6561.618408373,normal,23,worker,pipe.out,28
6667.420973560,normal,23,worker,resource.serve,28
7188.751262326,normal,24,worker,pipe.in,30
7188.751262326,normal,24,worker,pipe.out,30
7396.234526404,normal,25,worker,pipe.in,30
7580.453185706,normal,26,worker,pipe.in,18
7625.571122030,normal,27,worker,pipe.in,27
7836.772789002,normal,24,worker,resource.serve,30
7836.772789002,normal,25,worker,pipe.out,30
7857.863514232,normal,28,worker,pipe.in,23
8018.237158385,urgent,0,worker,pipe.in,4
8018.237158385,normal,25,worker,pipe.in,30
8018.237158385,normal,25,worker,resource.preempted,30
8018.237158385,urgent,0,worker,pipe.out,4
8255.201029505,urgent,0,worker,resource.serve,4
8255.201029505,normal,25,worker,pipe.out,30
8299.866510682,normal,25,worker,resource.serve,30
8299.866510682,normal,26,worker,pipe.out,18
8422.313710127,normal,26,worker,resource.serve,18
8422.313710127,normal,27,worker,pipe.out,27
8542.177775118,normal,29,worker,pipe.in,13
8591.937952381,normal,30,worker,pipe.in,15
8802.931266977,normal,27,worker,resource.serve,27
8802.931266977,normal,28,worker,pipe.out,23
8929.076654768,normal,28,worker,resource.serve,23
8929.076654768,normal,29,worker,pipe.out,13
8937.609249269,normal,29,worker,resource.serve,13
8937.609249269,normal,30,worker,pipe.out,15
9009.706894762,normal,30,worker,resource.serve,15
9063.117601840,normal,31,worker,pipe.in,24
9063.117601840,normal,31,worker,pipe.out,24
9289.059597445,normal,32,worker,pipe.in,10
9631.155697245,normal,33,worker,pipe.in,13
9636.118275916,urgent,1,worker,pipe.in,5
9636.118275916,normal,31,worker,pipe.in,24
9636.118275916,normal,31,worker,resource.preempted,24
9636.118275916,urgent,1,worker,pipe.out,5
9709.298375285,urgent,1,worker,resource.serve,5
9709.298375285,normal,31,worker,pipe.out,24
9809.085898695,normal,31,worker,resource.serve,24
9809.085898695,normal,32,worker,pipe.out,10
9843.829124590,normal,32,worker,resource.serve,10
9843.829124590,normal,33,worker,pipe.out,13
9866.210267659,normal,33,worker,resource.serve,13
9974.593753693,normal,34,worker,pipe.in,10
9974.593753693,normal,34,worker,pipe.out,10
10183.222598832,normal,34,worker,resource.serve,10
10897.129841255,normal,35,worker,pipe.in,18
10897.129841255,normal,35,worker,pipe.out,18
11155.488483529,normal,35,worker,resource.serve,18
11968.598520620,normal,36,worker,pipe.in,26
11968.598520620,normal,36,worker,pipe.out,26
12500.095149803,normal,36,worker,resource.serve,26
12699.872093131,normal,37,worker,pipe.in,19
12699.872093131,normal,37,worker,pipe.out,19
12834.504496732,normal,37,worker,resource.serve,19
13252.793003006,normal,38,worker,pipe.in,16
13252.793003006,normal,38,worker,pipe.out,16
13302.552454031,normal,39,worker,pipe.in,27
13482.814303893,normal,38,worker,resource.serve,16
13482.814303893,normal,39,worker,pipe.out,27
14173.103629395,normal,39,worker,resource.serve,27
14223.041715910,normal,40,worker,pipe.in,10
14223.041715910,normal,40,worker,pipe.out,10
14290.103153686,normal,40,worker,resource.serve,10
14497.138416267,normal,41,worker,pipe.in,13
14497.138416267,normal,41,worker,pipe.out,13
14639.440533474,urgent,2,worker,pipe.in,3
14639.440533474,normal,41,worker,pipe.in,13
14639.440533474,normal,41,worker,resource.preempted,13
14639.440533474,urgent,2,worker,pipe.out,3
14647.708063554,urgent,2,worker,resource.serve,3
14647.708063554,normal,41,worker,pipe.out,13
14756.627554918,normal,41,worker,resource.serve,13
15291.078014942,normal,42,worker,pipe.in,12
15291.078014942,normal,42,worker,pipe.out,12
15317.941702172,normal,43,worker,pipe.in,12
15370.939630123,normal,42,worker,resource.serve,12
15370.939630123,normal,43,worker,pipe.out,12
15462.235273946,normal,43,worker,resource.serve,12
15624.819792891,urgent,3,worker,pipe.in,2
15624.819792891,urgent,3,worker,pipe.out,2
15637.717693374,urgent,3,worker,resource.serve,2
16119.513371870,urgent,4,worker,pipe.in,5
16119.513371870,urgent,4,worker,pipe.out,5
16157.017642058,urgent,4,worker,resource.serve,5
16462.744174488,normal,44,worker,pipe.in,29
16462.744174488,normal,44,worker,pipe.out,29
16531.764504347,normal,44,worker,resource.serve,29
16627.789806147,normal,45,worker,pipe.in,27
16627.789806147,normal,45,worker,pipe.out,27
16769.225576392,urgent,5,worker,pipe.in,3
16769.225576392,normal,45,worker,pipe.in,27
16769.225576392,normal,45,worker,resource.preempted,27
16769.225576392,urgent,5,worker,pipe.out,3
16802.639208424,urgent,5,worker,resource.serve,3
16802.639208424,normal,45,worker,pipe.out,27
16928.858706170,normal,45,worker,resource.serve,27
17050.063833129,normal,46,worker,pipe.in,26
17050.063833129,normal,46,worker,pipe.out,26
17124.136129913,normal,46,worker,resource.serve,26
17230.226653091,normal,47,worker,pipe.in,12
17230.226653091,normal,47,worker,pipe.out,12
17336.724436350,normal,47,worker,resource.serve,12
17354.012346898,normal,48,worker,pipe.in,17
17354.012346898,normal,48,worker,pipe.out,17
17355.239205904,normal,48,worker,resource.serve,17
17620.352568738,normal,49,worker,pipe.in,30
17620.352568738,normal,49,worker,pipe.out,30
17638.555968902,normal,50,worker,pipe.in,11
17641.286342667,normal,49,worker,resource.serve,30
17641.286342667,normal,50,worker,pipe.out,11
17649.370572626,normal,50,worker,resource.serve,11
18227.609556225,normal,51,worker,pipe.in,17
18227.609556225,normal,51,worker,pipe.out,17
18325.526972951,normal,52,worker,pipe.in,27
18340.556460593,normal,51,worker,resource.serve,17
18340.556460593,normal,52,worker,pipe.out,27
18368.103843431,normal,53,worker,pipe.in,28
18602.156693553,urgent,6,worker,pipe.in,2
18602.156693553,normal,52,worker,pipe.in,27
18602.156693553,normal,52,worker,resource.preempted,27
18602.156693553,urgent,6,worker,pipe.out,2
18625.660180106,normal,54,worker,pipe.in,16
18635.109564140,urgent,6,worker,resource.serve,2
18635.109564140,normal,52,worker,pipe.out,27
18655.382871022,normal,55,worker,pipe.in,21
18820.657769568,normal,56,worker,pipe.in,24
18925.581562202,normal,52,worker,resource.serve,27
18925.581562202,normal,53,worker,pipe.out,28
18941.175794093,normal,53,worker,resource.serve,28
18941.175794093,normal,54,worker,pipe.out,16
19110.734835310,normal,54,worker,resource.serve,16
19110.734835310,normal,55,worker,pipe.out,21
19328.917751344,normal,55,worker,resource.serve,21
19328.917751344,normal,56,worker,pipe.out,24
19343.924326661,normal,56,worker,resource.serve,24
19418.827989615,normal,57,worker,pipe.in,20
19418.827989615,normal,57,worker,pipe.out,20
19441.970557868,normal,57,worker,resource.serve,20
19902.549448753,normal,58,worker,pipe.in,16
19902.549448753,normal,58,worker,pipe.out,16
19965.843141624,normal,59,worker,pipe.in,23
19997.800544845,normal,58,worker,resource.serve,16
19997.800544845,normal,59,worker,pipe.out,23
20026.657255714,normal,60,worker,pipe.in,12
20140.645452103,normal,59,worker,resource.serve,23
20140.645452103,normal,60,worker,pipe.out,12
20202.284694935,normal,61,worker,pipe.in,27
20233.196567673,normal,62,worker,pipe.in,30
20377.740978117,normal,60,worker,resource.serve,12
20377.740978117,normal,61,worker,pipe.out,27
20865.916386211,normal,61,worker,resource.serve,27
20865.916386211,normal,62,worker,pipe.out,30
21908.010590921,normal,62,worker,resource.serve,30
22405.104643840,normal,63,worker,pipe.in,17
22405.104643840,normal,63,worker,pipe.out,17
22459.673137995,normal,64,worker,pipe.in,16
22518.126433639,normal,63,worker,resource.serve,17
22518.126433639,normal,64,worker,pipe.out,16
22890.497166094,normal,64,worker,resource.serve,16
23059.641390231,normal,65,worker,pipe.in,15
23059.641390231,normal,65,worker,pipe.out,15
23202.555663625,normal,66,worker,pipe.in,18
23692.717827817,normal,65,worker,resource.serve,15
23692.717827817,normal,66,worker,pipe.out,18
23969.507264275,normal,66,worker,resource.serve,18
23985.770404155,normal,67,worker,pipe.in,19
23985.770404155,normal,67,worker,pipe.out,19
24129.411999484,urgent,7,worker,pipe.in,5
24129.411999484,normal,67,worker,pipe.in,19
24129.411999484,normal,67,worker,resource.preempted,19
24129.411999484,urgent,7,worker,pipe.out,5
24150.748200119,normal,68,worker,pipe.in,16
24162.753955272,urgent,7,worker,resource.serve,5
24162.753955272,normal,67,worker,pipe.out,19
24256.343058885,normal,69,worker,pipe.in,28
24655.586399733,normal,70,worker,pipe.in,11
24820.996876307,normal,67,worker,resource.serve,19
24820.996876307,normal,68,worker,pipe.out,16
24830.415160243,normal,68,worker,resource.serve,16
24830.415160243,normal,69,worker,pipe.out,28
25069.055163798,normal,71,worker,pipe.in,26
25076.114325739,normal,69,worker,resource.serve,28
25076.114325739,normal,70,worker,pipe.out,11
25159.430689843,normal,70,worker,resource.serve,11
25159.430689843,normal,71,worker,pipe.out,26
25174.656629241,normal,71,worker,resource.serve,26
25824.484256334,normal,72,worker,pipe.in,26
25824.484256334,normal,72,worker,pipe.out,26
25849.535088579,normal,73,worker,pipe.in,29
25870.649230507,normal,74,worker,pipe.in,17
25877.935030450,normal,72,worker,resource.serve,26
25877.935030450,normal,73,worker,pipe.out,29
26025.790657825,normal,75,worker,pipe.in,28
26110.585225500,normal,76,worker,pipe.in,29
26122.751104181,normal,77,worker,pipe.in,12
26285.768618591,normal,78,worker,pipe.in,28
26535.647932996,normal,79,worker,pipe.in,20
26701.643222715,normal,73,worker,resource.serve,29
26701.643222715,normal,74,worker,pipe.out,17
26740.485124224,normal,74,worker,resource.serve,17
26740.485124224,normal,75,worker,pipe.out,28
27093.132978907,normal,75,worker,resource.serve,28
27093.132978907,normal,76,worker,pipe.out,29
27172.218684318,normal,76,worker,resource.serve,29
27172.218684318,normal,77,worker,pipe.out,12
27232.677874590,normal,77,worker,resource.serve,12
27232.677874590,normal,78,worker,pipe.out,28
27354.305656355,normal,80,worker,pipe.in,19
27537.623542977,normal,81,worker,pipe.in,12
27540.431278109,normal,82,worker,pipe.in,29
27544.541223340,normal,78,worker,resource.serve,28
27544.541223340,normal,79,worker,pipe.out,20
28032.995398995,urgent,8,worker,pipe.in,1
28032.995398995,normal,79,worker,pipe.in,20
28032.995398995,normal,79,worker,resource.preempted,20
28032.995398995,urgent,8,worker,pipe.out,1
28040.045262756,urgent,8,worker,resource.serve,1
28040.045262756,normal,79,worker,pipe.out,20
28068.463203843,normal,79,worker,resource.serve,20
28068.463203843,normal,80,worker,pipe.out,19
28150.022453409,normal,80,worker,resource.serve,19
28150.022453409,normal,81,worker,pipe.out,12
28158.575078333,normal,81,worker,resource.serve,12
28158.575078333,normal,82,worker,pipe.out,29
28239.801232244,normal,82,worker,resource.serve,29