Skip to main content

Wicked fast hot reloading

Project description

Firehot

Firehot

A package to quickly hot reload large Python projects. Currently in development.

Background

Once your project gets to a certain size, the main overhead of application startup is typically the loading of 3rd party packages. Packages can do varying degrees of global initialization when they're imported. They can also require 100s or 1000s of additional files, which the AST parser has to step through one by one. Cached bytecode can help but it's not a silver bullet.

Eventually your bootup can take 5-10s just to load these modules. Fine for a production service that's intended to run continuously, but horrible for a development experience when you have to reboot after changes. Firehot solves this by importing dependencies once, then forking your environment for each exec. Think of it like building a docker image then executing it whenever you make a change.

Python Usage

from firehot import isolate_imports
from os import getpid, getppid

def run_under_environment(value: int):
   parent_pid = getppid()
   print(f"Running with value: {value} (pid: {getpid()}, parent_pid: {parent_pid})")

with isolate_imports("my_package") as environment:
   # Each exec will be run in a new process with the environment isolated, inheriting
   # the package's third party imports without having to re-import them from scratch.
   context1 = environment.exec(run_under_environment, 1)
   context2 = environment.exec(run_under_environment, 2)

   # These can potentially be long running - to wait on the completion status, you can do:
   result1 = environment.communicate_isolated(context1)
   result2 = environment.communicate_isolated(context2)

   # If you change the underlying file on disk to add an import, you can run update_environment.
   # If the files on disk don't add any new imports, it will be a no-op and keep the current
   # environment process running.
   environment.update_environment()

   # Subsequent execs will use the updated environment.
   context3 = environment.exec(run_under_environment, 3)
   result3 = environment.communicate_isolated(context3)

Logging

By default, Firehot logs at the warn level, but you can adjust this by setting the FIREHOT_LOG_LEVEL environment variable. Most of these logs come from the Rust code.

Available log levels (from most to least verbose):

  • trace: Extremely detailed information, useful for debugging specific issues
  • debug: Detailed information useful during development
  • info: General information about what's happening (default)
  • warn: Warning messages for potential issues
  • error: Error messages for actual problems

Example usage:

# Set to debug level for more detailed logs
FIREHOT_LOG_LEVEL=debug python your_script.py

# Set to error level for minimal logs
FIREHOT_LOG_LEVEL=error python your_script.py

Architecture

You launch Firehot by pointing it to your package name, which we resolve internally to a disk path that contains your code. From there, our Rust logic takes over. The pipeline will parse this directory recursively for all Python files, then parse the code's AST to determine which imports are used by your project.

It will then launch a continuously running process that caches only the 3rd party packages/modules. We think of this as the "template" process because it establishes the environment that will be used to run your code. None of your user code is run in this process.

When code changes are made in your project, we will:

  • Determine if your changes affected the imported packages
  • If not, we can fork the parent process and pass in your user code. This will load all modules from scratch, but because importlib caches the modules in global space, it will be a no-op because of the template.
  • If so, we will tear down the current parent process and start a new one with the full 3rd party packages imported. Then we'll fork the environment as normal.

Local Experiments

To test how firehot works with a real project, we bundle a mypackage and external-package library in this repo.

# To do a regular, fast development build
(make build-develop && cd mypackage && uv run test-hotreload)
# To pass the args we use in a release
(make build-develop MATURIN_ARGS="--release --strip" && cd mypackage && uv run test-hotreload)

Unit tests

cargo test

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

firehot-0.2.1.tar.gz (16.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

firehot-0.2.1-cp313-cp313-manylinux_2_39_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

firehot-0.2.1-cp313-cp313-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

firehot-0.2.1-cp312-cp312-manylinux_2_39_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

firehot-0.2.1-cp312-cp312-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

firehot-0.2.1-cp311-cp311-manylinux_2_39_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

firehot-0.2.1-cp311-cp311-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

firehot-0.2.1-cp310-cp310-manylinux_2_39_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

firehot-0.2.1-cp310-cp310-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file firehot-0.2.1.tar.gz.

File metadata

  • Download URL: firehot-0.2.1.tar.gz
  • Upload date:
  • Size: 16.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for firehot-0.2.1.tar.gz
Algorithm Hash digest
SHA256 47fc52f535276a2bbe77e8005f0d353f8e7d6012244c6e8a1ff2764c53316905
MD5 340a5df74c1d270c9ffe71f566e5395d
BLAKE2b-256 d878304d3b7758548153a2b07bcf908dc1bbe51ed1729d227445a0c045a6e43c

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1.tar.gz:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 49511caabdb87eba199d090aebbcaf7ec52f04164d9374a9903ad618001c1bd2
MD5 9b1e00ce2dccb0e8b9f1a0301700a86f
BLAKE2b-256 8bb2fca5569ea0cda9c48d9b94ac0ea1bbc7eddea224244fcac990853968c844

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp313-cp313-manylinux_2_39_x86_64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 27040f857b98b7b4160d997d86f47e7b8aa059e6a7dd0245bfd31084411103c2
MD5 17250edf39a3c0e514c61219214bd96a
BLAKE2b-256 cc1b2d91492f3a9fa12fcf176648922225010a4c7457742ff87aa3f76b72257a

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 8084c90c8419f636aab5af80b40d3c1743b65518978157552929ed64eafe5365
MD5 950b8ee3ff6072de2ba96018c02619a7
BLAKE2b-256 82fa765879604cdca70e2554fa0deb57ad3ec92d6d0faee1fb501b76a2c45860

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp312-cp312-manylinux_2_39_x86_64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fa5d4db5fc347dc0e8055ee60b842067b39e9c422e7ea3e64415bd72808eb21f
MD5 6898b21b9d76a8bed1f144ce3734c3c0
BLAKE2b-256 2c10f0f5375dd1d79dc3c5fdf6384833eebe2e13b8b7fe41bf3b5af8e8d203fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 a60c42d85d3da8881aa3b599300a15cbad17b7a218a2389473dfa014ea879327
MD5 42d333f62958d7e46a28907c537a8abd
BLAKE2b-256 41d8a42e6058a0c73f88f75beee2911e7481a503b2d4f98b0e5fcff2cbc15b27

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp311-cp311-manylinux_2_39_x86_64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf5ea14f3a055aa689e3869908dd5e33837308f2a26df43a968203b6d7f33b17
MD5 0e89451bd8ca06ec954328f24a08d79c
BLAKE2b-256 daf0cd4d3891726bf365a6f8c87247a43ea5610b5314cbd45c6b61f105569467

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 456e2a72991308efafd27bc0c338129198b69faa8b7a5a010b0e364a82a4bcde
MD5 65c8a6921350cdfb92c2ea96d8d52957
BLAKE2b-256 f55bf650f48c1e4cd494591370ab5cd785c19f475da7279fee44b1b2790a261f

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp310-cp310-manylinux_2_39_x86_64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file firehot-0.2.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for firehot-0.2.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9cc3d6cbadca210760c9224f7c4e11f9b6f84ec583321372b2d79def8cda6560
MD5 a180ae26a829a88dbd0b22949ee6ccd7
BLAKE2b-256 b321bc269a7d05da1cf556b9ddbeb7274f60b3c2e38044c34b31ac47933af277

See more details on using hashes here.

Provenance

The following attestation bundles were made for firehot-0.2.1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: ci-build.yml on piercefreeman/firehot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page