web-dev-qa-db-ja.com

Django populate()はリエントラントではありません

Djangoアプリケーションを実稼働環境にロードしようとすると、このエラーが発生し続けます。すべてのstackoverflowの答えを試しましたが、何も修正していません。他のアイデア。 (Django 1.5.2およびApacheを使用しています)

 Traceback (most recent call last):
         File "/var/www/thehomeboard/wwwhome/wsgi.py", line 37, in <module>
           application = get_wsgi_application()
         File "/usr/local/lib/python2.7/dist-packages/Django/core/wsgi.py", line 14, in get_wsgi_application
           Django.setup()
         File "/usr/local/lib/python2.7/dist-packages/Django/__init__.py", line 18, in setup
           apps.populate(settings.INSTALLED_APPS)
         File "/usr/local/lib/python2.7/dist-packages/Django/apps/registry.py", line 78, in populate
           raise RuntimeError("populate() isn't reentrant")
       RuntimeError: populate() isn't reentrant
28
ip.

最後に、私が抱えていた問題は、2番目のDjango=アプリを実行しようとしましたが、Apacheの設定で次のものが定義されていなかったことです。

WSGIDaemonProcess ...
WSGIProcessGroup ...

1つのDjangoアプリを定義せずに実行できますが、2つのアプリで競合が発生する場合があります。

6
ip.

このRuntimeErrorは、Django 1.7(およびDjango 1.8)で引き続き存在します。通常はDjangoアプリケーションはエラーを発生させますが、そのエラーはどういうわけか飲み込まれます。

これが私に役立つ回避策です。 wsgi.pyに追加すると、realエラーがログに記録されます。

import os
import time
import traceback
import signal
import sys
from Django.core.wsgi import get_wsgi_application

try:
    application = get_wsgi_application()
    print 'WSGI without exception'
except Exception:
    print 'handling WSGI exception'
    # Error loading applications
    if 'mod_wsgi' in sys.modules:
        traceback.print_exc()
        os.kill(os.getpid(), signal.SIGINT)
        time.sleep(2.5)

詳細については、modwsgiの this thread を参照してください。

32
Dirk Eschler

populate() isn't reentrantエラーの原因には多くの理由があります。 registry.py in Djangoおそらくこのディレクトリ内のアプリケーション
/python2.7/site-packages/Django/apps

        # app_config should be pristine, otherwise the code below won't
        # guarantee that the order matches the order in INSTALLED_APPS.
        if self.app_configs:
            raise RuntimeError("populate() isn't reentrant")

コメントにあるように、app_configは初期状態でなければなりません。つまり、構成の1つが正しくないか、必要なライブラリが見つからない場合、このエラーが発生します。 sqliteのインストールを逃したため、このエラーが発生しました。ご覧のように、例外には考えられる原因は記載されていません。このコマンドでDebianにsqliteをインストールしました

pip install pysqlite

それは私の問題を解決しました。 pysqliteが見つからないため、私の例外があります。多分、あなたのsettings.py

3
Harun ERGUL

完全な開示-「populate()is reentrant」エラーには複数の原因がある可能性があり、最近の構成またはプログラムの変更を確認することは非常に良い考えです。

ただし、このエラーは、Apacheが更新されたときにも発生する可能性があり、モジュールが無効になった/破損した/更新が必要になります。これは、Apacheの更新後にWebfactionで発生しました(ただし、どのホストでも発生する可能性があります)。

モジュールは再起動時にロードされたままなので、Apacheの再起動スクリプトを使用してもこれは役に立ちません。お使いのシステムと、Apacheがシャットダウンされている場合でもmodがキャッシュされるかどうかによって、これが役立つ場合があります。

Apacheを完全に停止します。 Webfactionでは、次のとおりです。

~/webapps/<YOUR WEB APP>/Apache2/bin/stop

数秒待ってから...

~/webapps/<YOUR WEB APP>/Apache2/bin/start

これで問題が修正されるはずです。システムがmodをキャッシュする場合、開始する前にキャッシュをフラッシュする必要があります。

お役に立てれば!

ここに彼らが私に与えたリンクがあります(エラーが異なることは知っていますが、同じエラーが発生し、ポピュレートエラーも発生しました)。

https://statusblog.webfaction.com/2018/05/16/regarding-glibc_private-errors-in-your-python-application/

1
MontyThreeCard

AWS Lambdaを使用している場合(およびオプションでzappaを使用している場合)、これは展開パッケージに圧縮されたコードと依存関係のサイズが解凍後に250MBを超えると発生する可能性があります。

通常、Zipは50 MBしかありませんが、250MB以上に解凍される可能性があるため、展開パッケージを手動で解凍して、解凍時に大きすぎないことを確認する必要があります。

https://docs.aws.Amazon.com/lambda/latest/dg/limits.html

0
python1981

私にとっては、INSTALLED_APPSをローカル用と本番用に正しく分割していなかったため、このエラーが発生しました。ローカルではDjango-cors-headersを使用していましたが、本番では使用していませんでした。しかし、私は実動Django-cors-headersから削除したにもかかわらず、誤ってrequirements.txtを残してしまいました。本番環境でインストールされたアプリからcors-headersを削除すると、エラーはなくなりました。

0
J. Hesters