Skip to main content

Pystalk

pystalk is an extremely simple Python client for beanstalkd.

This project was initially created for beancmd. You may also be interested in that tool!

CI

Note that none of the objects in this package are inherently synchronized (thread-safe), and if you are going to use them from multiple threads, you should always protect them with a mutex. Clients are also not fork-safe, and should be initialized after any forking.

Requirements / Installing

This software works with Python 3.6+. It should work PyPy3 but has not been tested extensively.

It does not support any asynchronous event loops and has not been tested with gevent. It's designed for simple, synchronous use.

You should be able to install it from PyPI with pip install pystalk.

Example Usage

Read the docs for more info.

Creating Jobs

#!/usr/bin/python

import json

from pystalk import BeanstalkClient

client = BeanstalkClient('10.0.0.1', 11300)
client.put_job(json.dumps({"foo": "bar"}), delay=30)

This will create a job with a 30-second delay on it. Note that the data for a job must be UTF-8 encodable.

Creating Jobs in Specific Tubes

Beanstalk has a notion of tubes (which is to say, named queues). There are several ways to put a job into a specific tube using pystalk:

#!/usr/bin/python

from pystalk import BeanstalkClient

client = BeanstalkClient('10.0.0.1', 11300)

# method 1, matches the upstream protocol
client.use("some_tube")
client.put_job("some message")

# method 2, using an external guard object like you would in C++ or Rust
with client.using("some_tube") as inserter:
    inserter.put_job("some message")


# method 3
client.put_job_into("some_tube", "some message")

Consuming All Available Jobs

The following script will walk through all currently-READY jobs and then exit:

#!/usr/bin/python

from pystalk import BeanstalkClient

client = BeanstalkClient('10.0.0.1', 11300)
client.watch('some_tube')
for job in client.reserve_iter():
    try:
        execute_job(job)
    except Exception:
        client.release_job(job.job_id)
        raise
    client.delete_job(job.job_id)

Note that, even though we require that job data be UTF-8 encodeable in the put_job method, we do not decode for you -- the job data that comes out is a byte-string in Python 3.5. You should call .decode("utf-8") on it if you want to get the input data back out. If you would like that behavior, pass auto_decode=True to the BeanstalkClient constructor; note that this might make it difficult for you to consume data injected by other systems which don't assume UTF-8.

Producing into Multiple Job Servers

This library includes the ProductionPool class, which will insert jobs into beanstalk servers, rotating between them when an error occurs. Example usage:

from pystalk import BeanstalkClient, ProductionPool

pool = ProductionPool.from_uris(
    ['beanstalkd://10.0.0.1:10300', 'beanstalkd://10.0.0.2:10300'],
    socket_timeout=10
)
pool.put_job_into('some tube', 'some job')

The Pool only supports the put_job and put_job_into methods and makes no fairness guarantees; you should not use it for consumption.

Consuming From Multiple Job Servers

The following will reserve jobs from a group of Beanstalk servers, fairly rotating between them.

#!/usr/bin/python

from myapp import execute_job
from pystalk import BeanstalkClient, BeanstalkTimedOutError

hosts = ('10.0.0.1', '10.0.0.2')
clients = dict((h, BeanstalkClient(h, 11300)) for h in hosts)

i = 0
while True:
    i += 1
    client = clients[hosts[i % len(hosts)]]
    try:
        job = client.reserve_job(1)
    except BeanstalkError as e:
        if e.message == 'TIMED_OUT':
            continue
        else:
            raise
    execute_job(job)
    client.delete_job(job.job_id)

Development

Pretty straightforward. Develop in branches, send PRs, land on master. All tests must pass before landing.

Releasing a new version

  1. Land all requisite changes
  2. Bump the version in pystalk/__init__.py to the stable version (e.g., 0.9.0)
  3. Update CHANGES.rst with the changes and the new version number
  4. Commit and push up to Github
  5. Draft a new GitHub Release, targeting a new tag matching the version (e.g., 0.9.0)
  6. Publishing the release triggers the release GitHub Actions workflow, which builds the sdist/wheel and publishes them to PyPI automatically

Metadata

Release files for pystalk 0.9.1

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

Source distribution (sdist)

Source distribution for pystalk 0.9.1
File Size Uploaded
pystalk-0.9.1.tar.gz 18.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pystalk 0.9.1
File Interpreter ABI Platform
pystalk-0.9.1-py3-none-any.whl Python 3 none any Details

Total release size: 36.0 kB

Release files / pystalk-0.9.1.tar.gz

Download URL pystalk-0.9.1.tar.gz
Size 18.6 kB
Tags Source
SHA-256 checksum
How to use checksums
b3a98f9f9f832356fc97be3afa612d643cc01e1a8cdcc68485902325b7d6feaf
BLAKE2b-256 checksum
How to use checksums
988a3a134ad69dbe7a7251c1bd5d5e812863fca3e497492e915137fb44852926
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pystalk-0.9.1-py3-none-any.whl

Download URL pystalk-0.9.1-py3-none-any.whl
Size 17.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c91bd9ac169f84124580237c456806b853bb44a8a5d6f8f727688e7545e61a02
BLAKE2b-256 checksum
How to use checksums
15efd6973a547c70a54e131160992504b6c749de6446adacf08b73c7dbdff80c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

0.9.1 This release

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.1

1 release file

0.6.0

3 release files

0.5.1

3 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

3 release files

0.2.1

1 release file

0.2

1 release file

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