Я использую сельдерей для обработки некоторых длительных задач, и локально все работает нормально.
Теперь я загрузил все на 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)