1

Django のビューで、スレッド (threading.Thread のクラス) を生成します。これにより、5 つのワーカーのマルチプロセッシング プールが作成されます。はい、Celery のようなタスク キューを使用することが通常は受け入れられている方法ですが、この場合はスレッド/マルチプロセッシングが必要でした。

スレッドと各マルチプロセス ワーカーの両方が、データベース内のアイテムにアクセスします。ただし、スレッドまたはワーカーで Django モデルを呼び出すと、「django.core.exceptions.AppRegistryNotReady: モデルはまだロードされていません」という例外が発生します。

完全なスタック トレースは次のとおりです。

Process SpawnPoolWorker-2:
Traceback (most recent call last):
  File "C:\Python34\lib\multiprocessing\process.py", line 254, in _bootstrap
    self.run()
  File "C:\Python34\lib\multiprocessing\process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python34\lib\multiprocessing\pool.py", line 108, in worker
    task = get()
  File "C:\Python34\lib\multiprocessing\queues.py", line 357, in get
    return ForkingPickler.loads(res)
  File "d:\bryan\Documents\Projects\spreadmodel_3.4_venv\lib\site-packages\djang
o\db\models\fields\__init__.py", line 59, in _load_field
    return apps.get_model(app_label, model_name)._meta.get_field_by_name(field_n
ame)[0]
  File "d:\bryan\Documents\Projects\spreadmodel_3.4_venv\lib\site-packages\djang
o\apps\registry.py", line 199, in get_model
    self.check_models_ready()
  File "d:\bryan\Documents\Projects\spreadmodel_3.4_venv\lib\site-packages\djang
o\apps\registry.py", line 131, in check_models_ready
    raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

スタック トレースに自分のコードの一部が表示されないのは奇妙です。

Thread init で django.setup() を実行しようとしましたが、メソッドの開始時にワーカーが開始されましたが、まだ成功していません。

モデルのどの時点でも、ユーザー モデルへの外部キーを実行するという一般的な問題のように、データベースから何かを読み取ろうとしません。


編集:

django.setup を init メソッドではなく、Simulation クラスのすぐ下に置くことで、スレッドでデータベース クエリを動作させることができます。しかし、ワーカーのクエリにはまだ問題があります。

編集2:

Python の queue.Queue ファイルを変更し、django.setup() 呼び出しを get 関数に入れると、すべてがうまく機能します。ただし、これは有効な解決策ではありません。何か案は?

編集3:

PyCharm 内でテストを実行すると、この問題に関連するテストが機能します。PyCharm の外部で通常のコマンド ラインでテストを実行する (またはサーバー [django テスト サーバーまたは CherryPy] からビュー サーバーを実行する) と、上記のエラーが発生します。


役立つ場合は、GitHub の views.py へのリンクを次に示します。

https://github.com/NAVADMC/SpreadModel/blob/b4bbbcf7020a3e4df0d021942ddcc5039234bd88/Results/views.py

今後の参考のために (バグを修正した後)、コミット b4bbbcf7 (上記のリンク) で奇妙な動作を確認できます。

4

0 に答える 0