Herbz
Herbz

Reputation: 111

Set up a while loop in celery task

I want to have a while loop going continuously in the background on my web server. I still want to have possibility to turn on and off the loop using flask giving command to my celery worker. The while loop in celery seems only run once.

from celery import Celery    
@app.task
    def count(i):
        if i == 1:  # turn on command
            while True:  # a while loop to achieve what I want to do
                i = i+1
                return i
        elif i == 0: # turn off command given by flask
            return i

I also tried celery_beat, but this requires me to give arguments in advance rather than accepting command from another source.

app.conf.update(
CELERYBEAT_SCHEDULE = {
    'add-every-1-seconds': {
        'task': 'tasks.count',
        'schedule': timedelta(seconds=1),
        #'args': (1)
    },
})

Upvotes: 1

Views: 5124

Answers (1)

Herbz
Herbz

Reputation: 111

Thanks for @dim's answer. The code I have now is:

@app.task
def count(i):
    if i == 1:
        while True:  # a while loop to achieve what I want to do
            i = i+1
            time.sleep(1)
            print i
            print 'i am counting'

To start the worker:

$ celery -A tasks worker -l info

And call it from python

>> from tasks import count
>> result = count(1)

To stop the loop from python

>> result.revoke(terminate=True)

Hope this will be useful for people wanting to have loop in their celery task.

Upvotes: 1

Related Questions