Search code examples
pythonscheduled-taskscelerycelery-taskflower

Celery - Activate a task via command line or HTTP requests


I have a predefined celery task in my code, say my_proj.tasks.my_celery_task

I want to activate the task via the command line/HTTP request (not via my application).

I searched the documents (saw flower and curl options) but there isn't a real good example of calling a predefined task there. How to achieve this?


Solution

  • Assuming you have installed Celery with Rabbitmq, here is a simple example.

    Define a task: my_app.py

    from celery import Celery
    
    app = Celery('tasks', backend='amqp', broker='amqp://')
    
    @app.task
    def add(x, y):
        return x + y
    

    Start a worker:

    celery worker -l info -A my_app
    

    Start flower

    flower -A my_app
    

    Add a task to queue via command line

    curl -X POST -d '{"args":[1,2]}' http://localhost:5555/api/task/async-apply/my_app.add
    

    or via requests

    import requests, json
    api_root = 'http://localhost:5555/api'
    task_api = '{}/task'.format(api_root)
    args = {'args': [1, 2]}
    url = '{}/async-apply/my_app.add'.format(task_api)
    print(url)
    resp = requests.post(url, data=json.dumps(args))
    reply = resp.json()
    reply