Skip to main content

Establish a connection to the errand-boy deamon to execute commands without the memory overhead incurred by os.fork().

Project description

https://travis-ci.org/SeanHayes/errand-boy.svg?branch=master https://coveralls.io/repos/SeanHayes/errand-boy/badge.png?branch=master

What does it do?

Uses Python multiprocessing to maintain a pool of worker processes used to execute arbitrary terminal commands.

Why not use subprocess.Popen()?

Under the hood subprocess.Popen() uses os.fork(), which copies the currently running process’ memory before launching the command you want to run. If your process uses a lot of memory, such as a Celery worker using an eventlet pool, this can cause a “Cannot allocate memory” error.

errand-boy still uses subprocess.Popen(), but tries to keep a low memory footprint. Your celery greenthread workers can communicate with it via asynchronous network calls.

Further reading:

  1. http://stackoverflow.com/a/13329386/241955

  2. http://stackoverflow.com/a/14942111/241955

Setup

Install:

pip install errand-boy

# optional pip install setproctitle

Usage

Run tests:

cd errand-boy/
python -m unittest discover

Run server:

python -m errand_boy.run

Run client (useful for testing/debugging):

python -m errand_boy.run 'ls -al'

Use the client in your code:

from errand_boy.transports.unixsocket import UNIXSocketTransport

errand_boy_transport = UNIXSocketTransport()

stdout, stderr, returncode = errand_boy_transport.run_cmd('ls -al')

print stdout
print stderr
print returncode

Use a subprocess.Popen-like interface:

from errand_boy.transports.unixsocket import UNIXSocketTransport


errand_boy_transport = UNIXSocketTransport()

with errand_boy_transport.get_session() as session:
    process = session.subprocess.Popen('ls -al', stdout=session.subprocess.PIPE, stderr=session.subprocess.PIPE, shell=True, close_fds=True)

    process_stdout, process_stderr = process.communicate()
    returncode = process.returncode

print stdout
print stderr
print returncode

Run load tests:

python -m errand_boy.run --max-accepts=0

pip install Fabric locustio
cd errand-boy/
fab locust_local

Does it work in other languages?

The client/server use an HTTP-inspired protocol, but the data that’s sent back and forth is currently serialized using Python’s Pickle format. Support could be added for other serialization types though.

Development

Further reading:

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

errand-boy-0.3.4.tar.gz (9.5 kB view details)

Uploaded Source

File details

Details for the file errand-boy-0.3.4.tar.gz.

File metadata

  • Download URL: errand-boy-0.3.4.tar.gz
  • Upload date:
  • Size: 9.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for errand-boy-0.3.4.tar.gz
Algorithm Hash digest
SHA256 4fb8377b1fbe2f5beb413d1ccd70d146aec4c5450aef1f1d7815d05a2e360417
MD5 9652ff50da5c8cd0a678f8b7d231a81f
BLAKE2b-256 9cd5a107088c5e2dbec7d38b1a2448cd577c678fd81419bd0ab824c4c06953e3

See more details on using hashes here.

Supported by

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