deco3 documentation¶
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.
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
@concurrentdecorator uses multiprocessing.pool to parallelize calls to the target functionIndexed based mutation of function arguments is handled automatically, which pool cannot do
The
@synchronizeddecorator automatically inserts synchronization eventsIt also automatically refactors assignments of the results of
@concurrentfunction calls to happen during synchronization events
Limitations¶
The
@concurrentdecorator will only speed up functions that take longer than ~1msIf they take less time your code will run slower!
By default,
@concurrentfunction arguments/return values must be pickleable for use withmultiprocessingThe
@synchronizeddecorator only works on ‘simple’ functions, make sure the function meets the following criteriaOnly calls, or assigns the result of
@concurrentfunctions to indexable objects such as:concurrent(…)
result[key] = concurrent(…)
Never indirectly reads objects that get assigned to by calls of the
@concurrentfunction
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:
Python 3.10 or higher
pip and setuptools
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 KarpierzCopyright (c) 2016 Alex ShermanLicensed under the MIT LicensePlease refer to the accompanying LICENSE file.