Как вводить аргументы рабочих мест сельдерея в запрашиваемую базу данных; используя 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