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 へのリンクを次に示します。
今後の参考のために (バグを修正した後)、コミット b4bbbcf7 (上記のリンク) で奇妙な動作を確認できます。