Getting Started with Celery: Architecture, Installation, and Basic Usage
This article introduces Celery, a Python‑based distributed task queue, explains its three‑part architecture, shows how to install RabbitMQ and Celery on an AWS EC2 Linux instance, and provides step‑by‑step code examples for defining tasks, running workers, and retrieving asynchronous results.
Celery is a Python‑based distributed task queue that enables task scheduling across multiple machines, processes, or threads.
Architecture
Celery consists of three components: a message broker (e.g., RabbitMQ, Redis, MongoDB, Amazon SQS, CouchDB, SQLAlchemy, Django ORM, IronMQ), workers that execute tasks, and a task result store (e.g., AMQP, Redis, memcached, MongoDB, SQLAlchemy, Django ORM, Apache Cassandra, IronCache).
Concurrency and Serialization
Workers can run using prefork, eventlet, gevent, or threads. Supported serializers include pickle, json, yaml, msgpack, zlib, bzip2, and cryptographic message signing.
Installation and Setup (AWS EC2 Linux example)
First install a broker; the example uses RabbitMQ, which requires Erlang. The following commands illustrate the required YUM and wget steps:
sudo yum -y update # Add and enable relevant application repositories: # Note: We are also enabling third‑party remi package repositories. wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm # Finally, download and install Erlang: yum install -y erlangThen install RabbitMQ:
# Download the latest RabbitMQ package using wget: wget ... # Add the necessary keys for verification: rpm --import ... # Install the .RPM package using YUM: yum install rabbitmq-server-3.2.2-1.noarch.rpmStart the RabbitMQ service: rabbitmq-server start Install Celery with pip: pip install Celery Create a simple task definition (tasks.py):
from celery import Celery
app = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')
app.conf.CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'
@app.task
def add(x, y):
return x + yRun a worker in the project directory: celery -A tasks worker --loglevel=info The -A flag specifies the Celery app name; the example uses SQLAlchemy as the result backend, which must be installed beforehand.
Sample client code to invoke the task:
from tasks import add
import time
result = add.delay(4, 4)
while not result.ready():
print "not ready yet"
time.sleep(5)
print result.get()Running the client prints "not ready" until the worker finishes, then outputs the result (8). Worker logs show the task ID, receipt, and successful completion.
Note: Using the AMQP backend for results can lose the return value because the message is removed from the queue after the worker reads it; storing results in a persistent backend such as SQLAlchemy avoids this issue.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Qunar Tech Salon
Qunar Tech Salon is a learning and exchange platform for Qunar engineers and industry peers. We share cutting-edge technology trends and topics, providing a free platform for mid-to-senior technical professionals to exchange and learn.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
