Как вводить аргументы рабочих мест сельдерея в запрашиваемую базу данных; используя mysql

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

Например:

add.apply_async(args=[num1, num2, user]

В этом случае я хочу сохранить пользовательский аргумент в БД, так что я могу запросить позже.

В настоящее время я возвращаю аргументы, которые хранятся в БД.

def add(num1, num2, user):
    return [num1+num2, user]

Однако когда задача запускается, пользователь не вставлен, и я не могу запросить его в БД. Есть ли решение/взломать для этого?

Ответ 1

Используете ли вы только MySql в качестве результата, или используете ли вы его для очереди (что я бы не рекомендовал)? Если вы используете его для очереди, аргументы должны быть в базе данных, как только задача будет отправлена. В противном случае результат задачи не может быть сохранен до завершения задачи.

Если вам нужно, чтобы аргументы были доступны для запроса во время выполнения задачи, вам необходимо вручную вставить их в таблицу БД в начале вашей задачи. Если вы хотите, чтобы они выполнялись с запросом перед запуском задачи, вам необходимо вставить их в таблицу DB непосредственно перед вызовом apply_async.

Ответ 2

Предполагая, что вы можете подключиться и выбрать в db, вы можете отделить функцию, которая запрашивает параметры и функцию callback, чтобы сохранить результаты в db.

Add() будет работать с результатами, а store_callback() будет хранить их в db при готовности. Поэтому, если параметры готовы, ваш код может перейти к следующей задаче и сохранить результат (пользователь), когда это будет сделано.

Что-то вроде:

def store_callback(result):
     sql_insert = 'INSERT INTO your_table VALUES(?, ?,)'
     curs.execute(sql_insert, result)  #result is a list passed from add()

def add(num1, num2, user):
    return [num1+num2, user]


# check parameters are present in db:
curs.execute("SELECT * FROM your_table WHERE user = ?", [_user])
user_exists = curs.fetchone()
#
if user_exists:
    add.apply_async( (num1, num2, user, ) , link=store_callback.s() )

вы можете даже связать add() с другой задачей.

Ответ 3

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

queue.get(timeout=10)# if nothing got then retry util get the arguments