Using Flask with Celery on Ubuntu
Celery Environment
- backend: redis
- broker: redis
Installation
- redis server
$ apt-get install redis-server
- python library
$ pip install redis $ pip install celery
Project Structure
project
├── __init__.py
├── web.py
├── work
├── __init__.py
├── worker.py
├── templates
├── index.html
- worker.py
from celery import Celery
cel = Celery('work',
backend='redis://127.0.0.1:6379/',
broker='redis://127.0.0.1:6379/')
@cel.task
def expensive_function(x, y):
return x + y
- web.py
from flask import Flask, render_template
from work.worker import expensive_function
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index():
result = expensive_function.delay(3, 3)
return render_template("index.html",
val=result.wait())
if __name__ == '__main__':
app.run()
- index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<h1>The value from celery's expensive function is {{ val }}</h1>
</body>
</html>
Execution
If redis is not working, running redis.
$ redis-server
Check redis is working.
$ redis-cli ping PONG
Start redis in interactive mode, you can know which ip and port is redis running.
$ redis-cli redis 127.0.0.1:6379>
Go to project directory
$ cd /your_project_path/project
Run celery worker
$ celery -A work.worker worker --loglevel=info --concurrency=2
--loglevel=info
: print log on terminal--concurrency=2
: specify the number of threads
Run flask web app
$ python web.py
Now, you can visit your web site, the web index will print
The value from celery's expensive function is 6
.And, the celery log will print
Received task successfully and return the 6 of computing result
at same time.