2016-07-13 7 views
10

私はセロリの結果バックエンドとしてMySqlを使用しています。 DBにもプログラム引数を格納したい。例えば照会するデータベースにセロリジョブの引数を入力する方法。 mysqlを使用して

:私は後で照会することができるように、DB内のユーザー引数を保存する。この場合

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

現在、DBに格納されている引数を返します。

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

ただし、タスクが実行中の場合、ユーザーは挿入されず、DBでクエリを実行できません。これには解決策やハックはありますか?

+1

_connect_できませんか?または_SELECT_できませんか? –

答えて

1

結果バックエンドとしてのみMySQLを使用しているのですか、それともキュー用に使用していますか(これはお勧めしません)?あなたがキューのためにそれを使用している場合、argsは、タスクが送信されるとすぐにデータベースにあるはずです。それ以外の場合は、タスクが終了するまでタスク結果を格納できません。

タスクの実行中に引数をクエリ可能にする必要がある場合は、タスクの開始時に手作業でDBテーブルに挿入する必要があります。タスクを開始する前にクエリ可能にしたい場合は、apply_asyncを呼び出す前にDBテーブルに挿入する必要があります。

+0

ありがとう!そこに1つの問題があります。各コマンドを送信する際に、新しいDB接続が開き、複数のcmdが実行されているときに問題が発生する可能性があります。私はDB接続をも扱うかもしれないセロリを探していました。 – Rajs123

+0

オープンなDB接続のプールを使用することをお勧めします。 –

0

データベースに接続して選択できると仮定すると、 のクエリパラメータと関数callbackを分離して、結果をdbに格納することができます。

Add()は結果を処理し、store_callback()は準備ができたらデータベースに保存します。 パラメータが用意されていれば、コードは次のタスクに進み、完了したら結果(ユーザ)を保存できます。あなたが別のタスクに)(追加してもリンクでき

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()) 

:よう

何か。

+0

コールバックは、ジョブが実行された後の結果を格納します。私は、実行中にジョブの状態、cmdと引数(与えられたタスクIDで)を照会する必要があります。 – Rajs123

0

キューが必要です。各ユーザーが自分用のキューを作成します。 セロリタスクはユーザーキューから引数を取得します。

queue.get(timeout=10)# if nothing got then retry util get the arguments 
関連する問題