Skip to main content

A decorator for concurrency.

Project description

deco3

Decorated Concurrency.

A simplified parallel computing model for Python. DECO automatically parallelizes Python programs, and requires minimal modifications to existing serial programs.

Overview

deco3 is a strict fork of Alex Sherman’s deco package with a fix allowing to work with Python3 or higher and with a little code reformatting and minor improvements.

PyPI record.

Documentation.

Overview below is a copy from the original deco website (with only the necessary changes regarding deco3).

Documentation

You can reference the Wiki on Github for slightly more in-depth documentation.

General Usage

Using DECO is as simple as finding, or creating, two functions in your Python program. The first function is the one we want to run in parallel, and is decorated with @concurrent. The second function is the function which calls the @concurrent function and is decorated with @synchronized. Decorating the second function is optional, but provides some very cool benefits. Let’s take a look at an example.

@concurrent  # We add this for the concurrent function
def process_lat_lon(lat, lon, data):
  #Does some work which takes a while
  return result

@synchronized  # And we add this for the function which calls the concurrent function
def process_data_set(data):
  results = defaultdict(dict)
  for lat in range(...):
    for lon in range(...):
      results[lat][lon] = process_lat_lon(lat, lon, data)
  return results

That’s it, two lines of changes is all we need in order to parallelize this program. Now this program will make use of all the cores on the machine it’s running on, allowing it to run significantly faster.

What it does

  • The @concurrent decorator uses multiprocessing.pool to parallelize calls to the target function

  • Indexed based mutation of function arguments is handled automatically, which pool cannot do

  • The @synchronized decorator automatically inserts synchronization events

  • It also automatically refactors assignments of the results of @concurrent function calls to happen during synchronization events

Limitations

  • The @concurrent decorator will only speed up functions that take longer than ~1ms

    • If they take less time your code will run slower!

  • By default, @concurrent function arguments/return values must be pickleable for use with multiprocessing

  • The @synchronized decorator only works on ‘simple’ functions, make sure the function meets the following criteria

    • Only calls, or assigns the result of @concurrent functions to indexable objects such as:

      • concurrent(…)

      • result[key] = concurrent(…)

    • Never indirectly reads objects that get assigned to by calls of the @concurrent function

How it works

For an in depth discussion of the mechanisms at work, we wrote a paper for a class which can be found here.

As an overview, DECO is mainly just a smart wrapper for Python’s multiprocessing.pool. When @concurrent is applied to a function it replaces it with calls to pool.apply_async. Additionally when arguments are passed to pool.apply_async, DECO replaces any index mutable objects with proxies, allowing it to detect and synchronize mutations of these objects. The results of these calls can then be obtained by calling wait() on the concurrent function, invoking a synchronization event. These events can be placed automatically in your code by using the @synchronized decorator on functions that call @concurrent functions. Additionally while using @synchronized, you can directly assign the result of concurrent function calls to index mutable objects. These assignments get refactored by DECO to automatically occur during the next synchronization event. All of this means that in many cases, parallel programming using DECO appears exactly the same as simpler serial programming.

Installation

Prerequisites:

To install run:

python -m pip install --upgrade deco3

Development

Prerequisites:

  • Development is strictly based on tox. To install it run:

    python -m pip install --upgrade tox

Visit Development page.

Installation from sources:

clone the sources:

git clone https://github.com/karpierz/deco3.git deco3

and run:

python -m pip install ./deco3

or on development mode:

python -m pip install --editable ./deco3

License

Copyright (c) 2025-2025 Adam Karpierz
Copyright (c) 2016 Alex Sherman
Licensed under the MIT License
Please refer to the accompanying LICENSE file.

Authors

Changelog

0.9.0 (2025-08-20)

  • 100% code coverage.

  • Making the package typed.

  • General improvements and cleanup.

  • Setup (dependencies) update.

0.8.3 (2025-06-11)

  • Setup (dependencies) update.

0.8.2 (2025-05-15)

  • The distribution is now created using ‘build’ instead of ‘setuptools’.

  • Setup (dependencies) update (due to regressions in tox and setuptools).

0.8.1 (2025-05-04)

  • Setup (dependencies) update.

0.8.0 (2025-04-28)

  • Add support for Python 3.14

  • Drop support for Python 3.9 (due to compatibility issues).

  • Update readthedocs’s python to version 3.13

  • Update tox’s base_python to version 3.13

  • Setup (dependencies) update.

0.7.0 (2025-04-27)

  • 100% code linting.

  • Add support for PyPy 3.10 and 3.11

  • Add/improve support for Python >= 3.9, <= 3.13

  • Drop support for Python <= 3.8

  • Drop support for Python 2.

  • Copyright year update.

  • Tox configuration is now in native (toml) format (as part of
    pyproject.toml) and now based on tox >= 4.0.
  • Setup update. Currently based on pyproject.toml.

  • Source distribution (*.tar.gz now) is compliant with PEP-0625.

  • Creating a fork of Alex Sherman’s deco package with a fix allowing to work with Python3 or higher and newest versions of pip/setuptools.

  • Minor improvements and cleanup..

Above are changes of the original (v.0.6.3) deco:

0.6.3 (2025-04-24)

  • Initial commit.

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

deco3-0.9.0.tar.gz (199.7 kB view details)

Uploaded Source

Built Distribution

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

deco3-0.9.0-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file deco3-0.9.0.tar.gz.

File metadata

  • Download URL: deco3-0.9.0.tar.gz
  • Upload date:
  • Size: 199.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for deco3-0.9.0.tar.gz
Algorithm Hash digest
SHA256 f13deee774cfefae5d96acafc6a69dd8e1f331d8004b7d26b3c824845efc8658
MD5 f75b0f9f30d7bd9719e9d6b5065b2406
BLAKE2b-256 b67ca847c25f602652526a988bf82f48acec33fab113e156ba26a5d130808e2b

See more details on using hashes here.

File details

Details for the file deco3-0.9.0-py3-none-any.whl.

File metadata

  • Download URL: deco3-0.9.0-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for deco3-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 32a59546801b9b78efef6b85e331a9842e5d3080fd136298db18ba0b17df351a
MD5 5c5538ddcffe5e6795aa84543118e43f
BLAKE2b-256 c484b532de04c0c441d9ce2abe7b2bdf10f018025d240a9984edd3fd8e373130

See more details on using hashes here.

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