2016-04-13 14 views
1

私はPython、Celery、cx_Oracleを使っています。共通オブジェクト(DB接続)を共有するセロリタスクの同時実行

私は労働者の束を立ち上げます。これらのワーカーは、データベース接続オブジェクトを共有します。

これは、データベース接続オブジェクト(db_conn)の作成方法です。 threaded=True paramenter注:

db_conn = cx_Oracle.connect(user=db_user, 
          password=db_password, 
          dsn=dsn, 
          threaded=True) 

これらの労働者によって運営されているタスクが完了するまでに数秒かかるいくつかのクエリを実行する上で主に構成されています。いくつかの作業者が時間的に重複する可能性(並行性)はかなり高いです。

私の質問は、データベース接続オブジェクト(db_conn)を共有する際に特別な措置を講じる必要がありますか?

セロリーはこれらのことを自動的に処理しますか?つまり、タスクがデータベース接続オブジェクトを使用している場合、Celeryは最初のワーカーが実行を終了するまで他のタスクを待機させますか?そうでない場合は、他のワーカーがそれを使用していない場合にのみ、各ワーカーにデータベース接続オブジェクトを使用させる方法を教えてください。

答えて

1

私は、クエリの1つが失敗したときにどうなるかを知っていることを確認したいと思います。新しいクエリはそれぞれ独自のトランザクションを開始しますか? db接続が完了したら、db接続が適切に閉じられていることを確認する必要があります。

作業者間でこのdb接続を共有する必要がある本当の理由はありますか?セルリーワーカー1つあたりの1つのdb接続は、実装がはるかに簡単で、保守が容易で、バグの発生が少なく、接続の開閉をより細かく制御できます。そして、あなたは、データベース接続が正しい順序で物事を通過することを期待するのではなく、Pythonの並行性の問題に対処することができます。