0

分散システムで処理されているジョブを説明するデータベーステーブルがあります。そのため、ジョブ全体が多くの小さなパーツに分割され、各パーツは独自の環境の異なるマシンで処理されます。

各プロセスがどのように進んだかを簡単に記録したいので、各ノードはSQLAlchemyを使用して同じジョブテーブルに接続し、UnicodeTextフィールドの最後にジョブ番号とステータスを追加しています。

私は次のようなものを見ることを期待しています:

Part 1: complete<br/>
Part 2: complete<br/>
Part 3: error<br/>
Part 4: complete<br/>
...etc

process.log += "Part 1: complete\n"パーツの処理が終了したら、各ノードで単純にを実行します。次に、session.commit()

部品番号が故障していることは承知しており、私の目的には問題ありませんが、代わりに、部品全体のエントリが数個しか取得されていないことが発生しています。多くのジョブが同時に終了していて、append+=を実行するのはスレッドセーフではないためだと思います。

私はセッションが苦手なので、セッションを構成するためのすべての秘訣を知りません。NullPoolを使用してみましたが無駄になりました。

このような分散環境で追加操作スレッドを安全にする方法はありますか?

4

1 に答える 1

0

テキストフィールドを並行して更新する場合は、これが内部で行われている方法です。各インスタンスは、オブジェクトをインスタンス化するときに元のフィールドを読み取ります(sessionmakerこれを処理して、スレッドごとにデータのインスタンスが存在するようにします)。 -保持エンティティ)、フィールドのバージョンにその部分を追加します。次に、それ自体のインスタンスがコミットされます。結果として得られるのは、-完全にスレッドセーフな-最後のバージョンです。最後に書かれたオブジェクトが勝ちます。

すべてのデータをこのデータ構造で同じフィールドにコミットする場合は、スレッド化のメリットを捨て、エンティティインスタンスの読み取りと書き込みを同期して、各スレッドがデータの読み取りを待機するようにする必要があります(追加)前任者がコミットした後まで。

すべきこと: SQLデータベースの利点を利用するようにデータ構造を変更しそれぞれの更新で独自のSQLレコードを作成します。

于 2014-01-23T22:18:26.727 に答える