Skip to content Skip to sidebar Skip to footer

Widget HTML #1

Learn SimPy from Scratch:Build Realistic Python Simulations

Simulations play a crucial role in understanding complex systems, making predictions, and testing various scenarios.

SimPy, a powerful Python library, provides a simple yet flexible framework for building discrete-event simulations.

In this tutorial, we will embark on a journey to learn SimPy from the ground up, enabling you to create realistic simulations that model real-world processes accurately.

Understanding Simulations and SimPy

Before diving into SimPy, let's grasp the concept of simulations.

Simulations replicate real-world scenarios by modeling the behavior of various components and their interactions over time.

This enables us to explore different situations, evaluate potential outcomes, and make informed decisions.

SimPy is a versatile simulation library that employs discrete-event simulation principles.

Unlike continuous simulations that model continuous processes, discrete-event simulations focus on events that occur at specific points in time, driving the simulation's progress.

SimPy excels in modeling complex systems, such as traffic flow, supply chain dynamics, and manufacturing processes, where events influence the system's state.

Installation and Setup

To get started with SimPy, you need to have Python installed on your system. If Python is not installed, you can download it from the official Python website ( Once Python is set up, installing SimPy is as simple as executing the following command in your terminal:

pip install simpy

With SimPy installed, you're ready to delve into simulation creation.

Basic Concepts in SimPy

SimPy revolves around three main concepts: Processes, Resources, and Events.

  1. Processes: In SimPy, processes represent entities that interact within the simulation. Processes are defined as Python generator functions, allowing them to be paused and resumed. For example, a process could be a car moving through a road network or a customer arriving at a service center.

  2. Resources: Resources model entities that are shared among processes. These could be physical objects like machines, or abstract concepts like permits. SimPy provides built-in resource types like Resource and Container that help manage resource allocation and utilization efficiently.

  3. Events: Events define moments when processes interact or conditions change. Events trigger the execution of specific functions or actions. For instance, an event could represent a car reaching a certain point in the road network or a customer completing service at a counter.

Building Your First Simulation

Let's create a simple simulation to illustrate these concepts. Imagine a bank with a limited number of tellers serving customers. We want to model the waiting time of customers and the utilization of tellers.

import simpy def customer(env, name, counter): print(f"{name} arrives at {}") with counter.request() as req: yield req print(f"{name} starts being served at {}") yield env.timeout(5) # Time taken for service print(f"{name} finishes at {}") env = simpy.Environment() counter = simpy.Resource(env, capacity=2) for i in range(4): env.process(customer(env, f"Customer {i}", counter))

In this simulation, we create an environment using simpy.Environment(), define a resource with a capacity of 2 tellers, and create four customer processes.

The customer process arrives at the bank, requests a teller, gets served, and then finishes after a timeout. The statement starts the simulation.

Enhancing Simulations with Monitoring and Statistics

Realistic simulations often require monitoring and collecting statistics for analysis. SimPy provides features to achieve this effectively.

import simpy import random def customer(env, name, counter, waiting_time): arrival_time = print(f"{name} arrives at {arrival_time}") with counter.request() as req: yield req start_time = print(f"{name} starts being served at {start_time}") yield env.timeout(random.uniform(3, 7)) # Random service time end_time = print(f"{name} finishes at {end_time}") waiting_time.append(start_time - arrival_time) env = simpy.Environment() counter = simpy.Resource(env, capacity=2) waiting_times = [] for i in range(4): env.process(customer(env, f"Customer {i}", counter, waiting_times)) average_waiting_time = sum(waiting_times) / len(waiting_times) print(f"Average waiting time: {average_waiting_time:.2f}")

In this enhanced simulation, we track and collect customer waiting times. The waiting_time list stores the waiting time of each customer, and after the simulation ends, we calculate the average waiting time.


SimPy is a valuable tool for creating realistic simulations that mirror complex systems and their interactions.

By understanding the core concepts of processes, resources, and events, and by practicing building simulations, you can gain a strong foundation in using SimPy effectively.

Whether you're a researcher, engineer, or enthusiast, the ability to simulate and analyze real-world scenarios will empower you to make informed decisions and gain insights into intricate processes.

So, embark on your journey with SimPy and uncover the world of simulations. Happy coding!

Learn More