Сельдерей Python3 редис на героку, ничего не происходит - PullRequest
0 голосов
/ 14 ноября 2018

Я использую сельдерей для обработки некоторых длительных задач, и локально все работает нормально.

Теперь я загрузил все на heroku, и это не работает. Я не вижу ошибок или предупреждений. Я вижу, что задачи инициированы, и я также вижу некоторую активность в моей надстройке redis (Heroku Redis :: Redis), но это так, задачи никогда не завершаются, это выглядит как бесконечный цикл.

Вот мой прокфайл:

web: gunicorn stats_main:app
worker: celery -A stats_main.celery --loglevel=info

Я добавил дополнение к Herois Redis и запустил его с:

heroku ps:scale worker=1

Это было успешно и по ресурсам в героку я вижу сейчас 2 типа динамометрических, паутина и рабочий динам.

Вот моя конфигурация для сервера redis:

if 'DYNO' in os.environ:
    app.config['CELERY_BROKER_URL'] = 'redis://[the full URL from the redis add-on]'
    app.config['CELERY_RESULT_BACKEND'] = 'redis://[the full URL from the redis add-on]'
else:
    app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
    app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost'

Вот пример задачи:

@celery.task(bind=True)
@basic_auth.required
@check_verified
def get_users_deregistrations_task(self, g_start_date, g_end_date):

    start_date = datetime.strptime(g_start_date, '%d-%m-%Y')
    end_date = datetime.strptime(g_end_date, '%d-%m-%Y')

    # A long task

    return {'some_value' : 'some_value'}

# Selects user deregistrations between selected dates
@app.route('/get-users-deregistration', methods=["POST"])
@basic_auth.required
@check_verified
def get_users_deregistrations():
    if request.method == "POST":

        # init task
        task = get_users_deregistrations_task.apply_async([session['g_start_date'], session['g_end_date']])
        return json.dumps({}), 202, {'Location': url_for('taskstatus_get_users_deregistrations', task_id=task.id)}

@app.route('/status/<task_id>')
@basic_auth.required
@check_verified
def taskstatus_get_users_deregistrations(task_id):
    task = get_users_deregistrations_task.AsyncResult(task_id)
    if task.state == 'PENDING':
        response = {
            'state': task.state,
            'current': 0,
            'total': 1,
            'status': 'Pending...'
        }
    elif task.state != 'FAILURE':
        response = {
            'state': task.state,
            'current': task.info['current'],
            'total': task.info['total'],
            'status': 'Finished',
            'statistic': task.info['statistic'],
            'final_dataset': task.info     
        }
        if 'result' in task.info:
            response['result'] = task.info['result']
    else:
        print ('in else')
        # something went wrong in the background job
        response = {
            'state': task.state,
            'current': 1,
            'total': 1,
            'status': str(task.info),  # this is the exception raised
        }
    return json.dumps(response)
...