処理が必要なため、マルチスレッド方式で生成したい数万 (場合によっては数百) の永続オブジェクトがあります。
オブジェクトの作成は別のスレッドで行われますが (範囲指定されたセッションで Flask-SQLAlchemy 拡張機能を使用)、生成されたオブジェクトを DB に書き込むための呼び出しは、生成が完了した後に 1 か所で行われます。
問題は、作成されるオブジェクトがいくつかの既存の関係の一部であることです。そのため、どのスレッドにも明示的なセッションがない個別の並行スレッドで作成されたにもかかわらず、ID マップへの自動追加がトリガーされます。
生成されたオブジェクトを 1 つのリストに含め、リスト全体を (1 つのセッション オブジェクトを使用して) データベースに書き込むことを望んでいました。これにより、次のようなエラーが発生します。
AssertionError: A conflicting state is already present in the identity map for key (<class 'app.ModelObject'>, (1L,))
したがって、同時実行コードの外部でグローバルセッションを使用して追加およびコミットしようとすると、アサーションエラーがトリガーされるため、アイデンティティマップが既に入力されていると私が考える理由です。
最後の詳細は、セッションオブジェクトが何であれ(マルチスレッドの場合にアイデンティティマップへの自動追加がどのように機能するかを完全に理解していないため、スコープまたはそれ以外)、方法を見つけることができない/方法がわからないということですそれらへの参照を取得して、プロセスごとに個別のセッションを処理したい場合でもできるようにします。
どんなアドバイスでも大歓迎です。私が (まだ) コードを投稿していない唯一の理由は、実際の例をアプリからすぐに抽出するのが難しいからです。誰かが本当にそれを見る必要がある場合は投稿します。