Elasticsearch を使用して Django で並列テストを実行した人はいますか? もしそうなら、それを実現するために必要な構成変更を共有できますか?
here で説明されているソリューションを含め、機能させるために考えられるすべてのことを試しました。Django 自体が並列 DB を行う方法からインスピレーションを得て、現在ParallelTestSuite
、init_worker をオーバーライドして各インデックス/ドキュメントタイプを反復処理し、インデックス名を次のように大まかに変更するカスタム new を作成しました。
_worker_id = 0
def _elastic_search_init_worker(counter):
global _worker_id
with counter.get_lock():
counter.value += 1
_worker_id = counter.value
for alias in connections:
connection = connections[alias]
settings_dict = connection.creation.get_test_db_clone_settings(_worker_id)
# connection.settings_dict must be updated in place for changes to be
# reflected in django.db.connections. If the following line assigned
# connection.settings_dict = settings_dict, new threads would connect
# to the default database instead of the appropriate clone.
connection.settings_dict.update(settings_dict)
connection.close()
### Everything above this is from the Django version of this function ###
# Update index names in doctypes
for doc in registry.get_documents():
doc._doc_type.index += f"_{_worker_id}"
# Update index names for indexes and create new indexes
for index in registry.get_indices():
index._name += f"_{_worker_id}"
index.delete(ignore=[404])
index.create()
print(f"Started thread # {_worker_id}")
これは通常はうまくいくように見えますが、一見ランダムに発生する奇妙な点があります (つまり、テスト スイートを再度実行しても問題が確実に再現されないか、エラー メッセージが変化します)。以下は、私が得たさまざまなエラーであり、テストの実行ごとにそのうちの 1 つでランダムに失敗するようです。
- 上記の関数でインデックスを作成しようとすると 404 が発生します (404 が PUT 要求から返されることを確認しましたが、Elasticsearch サーバー ログでは、問題なくインデックスが作成されたことが示されています)。
- インデックスを作成しようとすると 500 になりますが、これはしばらく発生していないため、他の方法で修正されたと思います
- クエリ応答には、elasticsearch ライブラリ
items
の関数内に辞書値がない場合があります。_process_bulk_chunk
接続レイヤーで何か奇妙なことが起こっていると考えています (Django テスト ランナー プロセス間の接続が応答を混同しているように) が、Django がmultiprocessing を使用してテストを並列化するため、テストはそれぞれ独自のプロセスで実行されます。スピンオフされたプロセスがまだ元のプロセスの接続プールなどを使用しようとしている可能性はありますか? 私は本当にここから他に試してみることができず、いくつかのヒントや、これが実際に可能であることの確認さえもいただければ幸いです。