Skip to main content

AtomicExecutionControl

PyPI Downloads License: MIT

AtomicExecutionControl is a Python library crafted to address the complexities of ensuring atomic operations across distributed applications, particularly those deployed on AWS services like Lambda, Fargate, and EC2. By leveraging DynamoDB, this library offers a robust mechanism to prevent concurrent executions, thus mitigating race conditions and duplicate processing risks. Whether you're handling event-driven workflows, orchestrating microservices, or ensuring data integrity across distributed systems, AtomicExecutionControl simplifies state management and execution coordination, making your applications more reliable, efficient and most important 'atomic'.

Features

  • Atomic Execution: Ensures that only one instance of a the function processes a specific task at a time.
  • Status Management: Tracks the execution status of tasks in DynamoDB, marking them as in progress or finished.
  • Timeout Handling: Supports time-based expiry for task locks, making it resilient to failures or stalls in execution.
  • Easy Integration: Designed to be easily integrated into existing AWS Lambda, Fargate or EC2 functions with minimal configuration.

Quick Start

Get up and running with AtomicExecutionControl in just a few steps:

  1. Install the package:
pip install atomic_execution_control
  1. Set up a DynamoDB table in AWS with a primary key.

  2. Use the following snippet to ensure atomic execution in your project:

from atomic_execution_control import AtomicExecutionControl

# Initialize with your DynamoDB table details
aec = AtomicExecutionControl(table_name="YourTable", primary_key="YourKey")

# Start controlling execution atomically

Prerequisites

A DynamoDB table set up for tracking execution statuses.

Configuration

AtomicExecutionControl can be configured with the following parameters during initialization:

  • table_name (required): The name of the DynamoDB table used for tracking execution.
  • primary_key (required): The primary key attribute name in your DynamoDB table.
  • region_name (optional, default="eu-west-1"): The AWS region where your DynamoDB table is located.
  • endpoint_url (optional): Custom endpoint URL, useful for local testing with DynamoDB Local.

Additional method parameters:

  • delete_items_finished_or_old method:
    • item_execution_valid_for (optional, default=20): Time in minutes to consider an execution old enough to be deleted.
  • wait_other_instances_finish method:
    • timeout (optional): Maximum time in seconds to wait for the 'finished' status.
    • time_to_retry (optional): Time in seconds to wait before trying to validate the status again.

Examples

Preventing Duplicate Processing

Below is a quick example to help you get started:

from atomic_execution_control import AtomicExecutionControl
import os

# DynamoDB table and primary key
TABLE_NAME = 'YourDynamoDBTableName'
PRIMARY_KEY = 'YourPrimaryKey'

# Test also in your local environment 
# verify the endpoint_url, this url "http://localhost:8000" is also valid.
endpoint_url = "http://docker.for.mac.localhost:8000/" if os.environ.get("AWS_SAM_LOCAL") else None
 
# Initialize AtomicExecutionControl
aec = AtomicExecutionControl(
    table_name=TABLE_NAME,
    primary_key=PRIMARY_KEY,
    region_name="eu-west-1",
    endpoint_url=endpoint_url
)

# In case you already log into an specific AWS account via AWS Single Sign-On (SSO)
# you can send the profile_name parameter as follow.
profile_name =  'AwsProfileName'
aec = AtomicExecutionControl(
    table_name=TABLE_NAME,
    primary_key=PRIMARY_KEY,
    region_name="eu-west-1",
    endpoint_url=endpoint_url,
    profile_name=profile_name
)

# Assume you have an event-driven architecture where multiple events 
# could trigger the same task
date_to_run = '2024-01-01'


# delete items in Dynamo for old executions
aec.delete_items_finished_or_old(keys=[date_to_run], item_execution_valid_for=20)

# write in Dynamo the date_to_run and block other executions to the same key
result = aec.write_atomically_a_key(key=date_to_run)

if result:
    # Process the event
    
    print("Lock acquired, proceeding with task.")
    
    ## run_your_etl(date_to_run)
    
    # Remember to update the status to 'finished' after completing your task
    aec.update_status(key=date_to_run)
else:
    # If lock couldn't be acquired, another instance is already processing the task
    print("Task already in progress by another instance.")
    # wait until other instances with the same key finish
    aec.wait_other_instances_finish(keys=[date_to_run])

Support and Contact

Encountering issues or have questions about integrating AtomicExecutionControl? We're here to help!

  • Ask a Question or Report an Issue: For technical issues or questions, please open an issue on our GitHub repository.
  • Email Us: For direct support or inquiries, email us at jdaarevalo@gmail.com - we aim to respond as quickly as possible.
  • Suggestions: Your feedback and suggestions are invaluable in making AtomicExecutionControl better. Don't hesitate to reach out with ideas for improvements or new features!

Contributing

Contributions are welcome! Feel free to open an issue or submit a pull request on GitHub.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Metadata

Release files for atomic-execution-control 0.1.5

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

Source distribution (sdist)

Source distribution for atomic-execution-control 0.1.5
File Size Uploaded Provenance Actions
atomic_execution_control-0.1.5.tar.gz 7.6 kB Without provenance Details for atomic_execution_control-0.1.5.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for atomic-execution-control 0.1.5
File Interpreter ABI Platform Actions
atomic_execution_control-0.1.5-py3-none-any.whl Python 3 none any Details for atomic_execution_control-0.1.5-py3-none-any.whl

Total release size: 15.5 kB

Release files / atomic_execution_control-0.1.5.tar.gz

Download URL atomic_execution_control-0.1.5.tar.gz
Size 7.6 kB
Tags Source
SHA-256 checksum
How to use checksums
3536369082bd136da89e44773eee6cc8aa392369c39d6cf1867761b3b7b96b81
BLAKE2b-256 checksum
How to use checksums
359605539f8ebb34aed350a10d7959f76d24fabd05009632c67a472789ae3b87
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.10.13

Release files / atomic_execution_control-0.1.5-py3-none-any.whl

Download URL atomic_execution_control-0.1.5-py3-none-any.whl
Size 7.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fa7db146e4a5584bf7dbcbd320f02a50dd969ac5e37c82322c41fa61bb2b4368
BLAKE2b-256 checksum
How to use checksums
3987742e0742c3bcff9d32dbed7d72165a12b767631921b2bfe099354a91f1d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.10.13

Security for atomic-execution-control 0.1.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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