Package: pystalk
pystalkis an extremely simple Python client forbeanstalkd.This project was initially created forbeancmd. You may also be interested in that tool!Note thatnoneof 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 / InstallingThis 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 fromPyPIwithpip install pystalk.Example UsageCreating Jobs#!/usr/bin/pythonimportjsonfrompystalkimportBeanstalkClientclient=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 TubesBeanstalk has a notion oftubes (which is to say, named queues). There are several ways to put a
job into a specific tube using pystalk:#!/usr/bin/pythonfrompystalkimportBeanstalkClientclient=BeanstalkClient('10.0.0.1',11300)# method 1, matches the upstream protocolclient.use("some_tube")client.put_job("some message")# method 2, using an external guard object like you would in C++ or Rustwithclient.using("some_tube")asinserter:inserter.put_job("some message")# method 3client.put_job_into("some_tube","some message")Consuming All Available JobsThe following script will walk through all currently-READY jobs and then exit:#!/usr/bin/pythonfrompystalkimportBeanstalkClientclient=BeanstalkClient('10.0.0.1',11300)forjobinclient.reserve_iter():try:execute_job(job)exceptException:client.release_job(job.job_id)raiseclient.delete_job(job.job_id)Note that, even though we require that job data be UTF-8 encodeable in theput_jobmethod, 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, passauto_decode=Trueto theBeanstalkClientconstructor; 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 ServersThis library includes theProductionPoolclass, which will insert jobs into beanstalk servers, rotating between them
when an error occurs. Example usage:frompystalkimportBeanstalkClient,ProductionPoolpool=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 Poolonlysupports theput_jobandput_job_intomethods and makes no fairness guarantees; you should not use
it for consumption.Consuming From Multiple Job ServersThe following will reserve jobs from a group of Beanstalk servers, fairly rotating between them.#!/usr/bin/pythonfrommyappimportexecute_jobfrompystalkimportBeanstalkClient,BeanstalkTimedOutErrorhosts=('10.0.0.1','10.0.0.2')clients=dict((h,BeanstalkClient(h,11300))forhinhosts)i=0whileTrue:i+=1client=clients[hosts[i%len(hosts)]]try:job=client.reserve_job(1)exceptBeanstalkErrorase:ife.message=='TIMED_OUT':continueelse:raiseexecute_job(job)client.delete_job(job.job_id)DevelopmentPretty straightforward. Develop in branches, send PRs, land on master. All tests must pass before landing.Releasing a new versionLand all requisite changesBump the version insetup.pyandpystalk/__init__.pyto the stable version (e.g.,0.2)UpdateCHANGES.rstwith the changes and the new version numberUpdateconf.pywith the new version numberCommitTag the version (e.g.,git tag -s pystalk-0.2)Push up to GithubUpload to PyPI withpython setup.py sdist upload