Skip to main content

Delta Cycle

DeltaCycle is a Python library for discrete event simulation (DES).

A simulation has two components: a collection of variables, and a collection of tasks. Variables represent the instantaneous state of the simulation. They may be organized into arbitrary data structures. Tasks define how that state evolves. They may appear concurrent, but are scheduled sequentially.

Task execution is subdivided into a sequence of slots. Slots are assigned a monotonically increasing integer value, called time. Multiple tasks may execute in the same slot, and therefore at the same time. The term "delta cycle" refers to a zero-delay subdivision of a time slot. It is the clockwork mechanism behind the illusion of concurrency.

Read the docs! (WIP)

Documentation Status

Features

  • Kernel: task scheduler
  • Task: coroutine wrapper
  • Synchronization Primitives:
    • Events
    • Semaphores
    • Credit Pools
    • Queues
    • Containers
  • Structured Concurrency:
    • Task Groups (parent/child hierarchy)
    • Interrupts
    • Exceptions
  • Model Variables:
    • Singular
    • Aggregate

Example

The following code simulates singing in the round. Four singers perform "Row, Row, Row Your Boat" in staggered fashion. Each singer is represented by a coroutine. A separator coroutine draws lines for readability. The coroutines are wrapped by tasks, and tasks are assigned a priority for precise ordering of concurrent events.

>>> from deltacycle import *

>>> song = [
...     "Row, row, row your boat",
...     "Gently down the stream",
...     "Merrily, merrily, merrily, merrily",
...     "Life is but a dream",
... ]

>>> async def singer(name: str, delay: int = 0):
...     await sleep(delay)
...     for line in song:
...         print(f"{now()}  ♫ {name}: {line:34} ♫")
...         await sleep(1)

>>> async def separator():
...     while True:
...         print(f"{now()}  ♫---------------------------------------♫")
...         await sleep(1)

>>> async def main():
...     t = create_task(separator(), priority=-1)
...
...     async with TaskGroup() as tg:
...         tg.create_task(singer("A", delay=0), priority=1)
...         tg.create_task(singer("B", delay=1), priority=2)
...         tg.create_task(singer("C", delay=2), priority=3)
...         tg.create_task(singer("D", delay=3), priority=4)
...
...     t.interrupt()  # Interrupt separator task
...
...     return "Bow / Curtsy"

>>> r = run(main())
0  ♫---------------------------------------♫
0  ♫ A: Row, row, row your boat            ♫
1  ♫---------------------------------------♫
1  ♫ A: Gently down the stream             ♫
1  ♫ B: Row, row, row your boat            ♫
2  ♫---------------------------------------♫
2  ♫ A: Merrily, merrily, merrily, merrily ♫
2  ♫ B: Gently down the stream             ♫
2  ♫ C: Row, row, row your boat            ♫
3  ♫---------------------------------------♫
3  ♫ A: Life is but a dream                ♫
3  ♫ B: Merrily, merrily, merrily, merrily ♫
3  ♫ C: Gently down the stream             ♫
3  ♫ D: Row, row, row your boat            ♫
4  ♫---------------------------------------♫
4  ♫ B: Life is but a dream                ♫
4  ♫ C: Merrily, merrily, merrily, merrily ♫
4  ♫ D: Gently down the stream             ♫
5  ♫---------------------------------------♫
5  ♫ C: Life is but a dream                ♫
5  ♫ D: Merrily, merrily, merrily, merrily ♫
6  ♫---------------------------------------♫
6  ♫ D: Life is but a dream                ♫
7  ♫---------------------------------------♫

>>> print(r)
Bow / Curtsy

Installing

DeltaCycle is available on PyPI:

$ pip install deltacycle

It requires Python 3.12+

Developing

DeltaCycle's repository is on GitHub:

$ git clone https://github.com/cjdrake/deltacycle.git

It is 100% Python, and has no runtime dependencies. Development dependencies are listed in pyproject.toml.

Metadata

Release files for deltacycle 0.43.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for deltacycle 0.43.2
File Size Uploaded
deltacycle-0.43.2.tar.gz 35.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for deltacycle 0.43.2
File Interpreter ABI Platform
deltacycle-0.43.2-py3-none-any.whl Python 3 none any Details

Total release size: 61.5 kB

Release files / deltacycle-0.43.2.tar.gz

Download URL deltacycle-0.43.2.tar.gz
Size 35.8 kB
Tags Source
SHA-256 checksum
How to use checksums
cdc4ea9a6a0e059452c05b2d1e932242dc6dddc6658238375343c873ddc7d42c
BLAKE2b-256 checksum
How to use checksums
a1ef00e93cf4465eb1307964ca9befa35f539ddf17abb74334075c6a186c6248
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / deltacycle-0.43.2-py3-none-any.whl

Download URL deltacycle-0.43.2-py3-none-any.whl
Size 25.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
80f6da0a140f8810936ab55e19bd6c78a64222f9f423d999df5ec5ab3351e053
BLAKE2b-256 checksum
How to use checksums
408b01eac9582855b2eed813cab18a164f25ce28950812d81f2238e44e107aab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.43.2 This release

2 release files

0.43.1

2 release files

0.43.0

2 release files

0.42.0

2 release files

0.41.0

2 release files

0.38.0

2 release files

0.37.1

2 release files

0.37.0

2 release files

0.36.0

2 release files

0.30.0

2 release files

0.29.1

2 release files

0.29.0

2 release files

0.28.0

2 release files

0.26.0

2 release files

0.25.0

2 release files

0.24.1

2 release files

0.24.0

2 release files

0.23.0

2 release files

0.22.0

2 release files

0.21.0

2 release files

0.20.0

2 release files

0.19.0

2 release files

0.18.0

2 release files

0.14.0

2 release files

0.13.1

2 release files

0.13.0

2 release files

0.12.2

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.2

2 release files

0.11.1

2 release files

0.11.0

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page