Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (
Help us improve Python packaging - Donate today!

Dispatch your trivially parallizable jobs with sharedmem.

Project Description

Dispatch your trivially parallizable jobs with sharedmem.

Now also supports Python 3.

  • sharedmem.empty creates numpy arrays shared by child processes.
  • sharedmem.MapReduce dispatches work to child processes, allowing work functions defined in nested scopes.
  • sharedmem.MapReduce.ordered and sharedmem.MapReduce.critical implements the equivelant concepts as OpenMP ordered and OpenMP critical sections.
  • Exceptions are properly handled, including unpicklable exceptions. Unexpected death of child processes (Slaves) is handled in a graceful manner.

Functions and variables are inherited from a fork syscall and the copy-on-write mechanism, except sharedmem variables which are writable from both child processes or the main process. Pickability of objects is not a concern.

Usual limitations of fork do apply. sharedmem.MapReduce is easier to use than multiprocessing.Pool, at the cost of not supporting Windows.

For documentation, please refer to .

Here we provide two simple examples to illustrate the usage:

    Integrate [0, ... 1.0) with rectangle rule.
    Compare results from
    1. direct sum of 'xdx' (filled by subprocesses)
    2. 'shmsum', cummulated by partial sums on each process
    3. sum of partial sums from each process.

xdx = sharedmem.empty(1024 * 1024 * 128, dtype='f8')
shmsum = sharedmem.empty((), dtype='f8')

shmsum[...] = 0.0

with sharedmem.MapReduce() as pool:

    def work(i):
        s = slice (i, i + chunksize)
        start, end, step = s.indices(len(xdx))

        dx = 1.0 / len(xdx)

        myxdx = numpy.arange(start, end, step) \
                * 1.0 / len(xdx) * dx

        xdx[s] = myxdx

        a = xdx[s].sum(dtype='f8')

        with pool.critical:
            shmsum[...] += a

        return i, a

    def reduce(i, a):
        # print('chunk', i, 'done', 'local sum', a)
        return a

    chunksize = 1024 * 1024

    r =, range(0, len(xdx), chunksize), reduce=reduce)

assert_almost_equal(numpy.sum(r, dtype='f8'), shmsum)
assert_almost_equal(numpy.sum(xdx, dtype='f8'), shmsum)
    An example word counting program. The parallelism is per line.

    In reality, the parallelism shall be at least on a file level to
    benefit from sharedmem / multiprocessing.

word_count = {
        'sharedmem': 0,
        'pool': 0,

with sharedmem.MapReduce() as pool:

    def work(line):
        # create a fresh local counter dictionary
        my_word_count = dict([(word, 0) for word in word_count])

        for word in line.replace('.', ' ').split():
            if word in word_count:
                my_word_count[word] += 1

        return my_word_count

    def reduce(her_word_count):
        for word in word_count:
            word_count[word] += her_word_count[word], file(__file__, 'r').readlines(), reduce=reduce)

    parallel_result = dict(word_count)

    # establish the ground truth from the sequential counter

    for word in word_count:
        word_count[word] = 0, file(__file__, 'r').readlines(), reduce=reduce)

for word in word_count:
    assert word_count[word] == parallel_result[word]

Release History

This version
History Node


History Node


History Node


History Node


History Node


History Node


History Node


Download Files

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

File Name & Hash SHA256 Hash Help Version File Type Upload Date
(36.0 kB) Copy SHA256 Hash SHA256
2.7 Egg Oct 25, 2016
(15.5 kB) Copy SHA256 Hash SHA256
Source Oct 25, 2016

Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting