2017-10-24 1 views
1

Ich mache ein Django-Projekt und versuchen, die Rechengeschwindigkeit im Backend zu verbessern.Apps sind noch nicht geladen Ausnahme tritt bei der Verwendung von Multi-Processing in Django

Die Aufgabe ist so etwas wie eine CPU-gebundene Umwandlungsprozess

Hier meine Umgebung

  • Python 3.6.1
  • Django 1.10
  • PostgreSQL 9,6

Und ich ist hafte mit folgenden Fehlern, wenn ich versuche, eine Computing-API durch Python-Multi-Processing-Bibliothek zu parallelisieren .

File "D:\\project\apps\converter\models\convert_manager.py", line 1, in <module> 
    from apps.conversion.models import Conversion 
    File "D:\\project\apps\conversion\models.py", line 5, in <module> 
    class Conversion(models.Model): 
    File "C:\\virtenv\lib\site-packages\django\db\models\base.py", line 105, in __new__ 
    app_config = apps.get_containing_app_config(module) 
    File "C:\\virtenv\ib\site-packages\django\apps\registry.py", line 237, in get_containing_app_config 
    self.check_apps_ready() 
    File "C:\\lib\site-packages\django\apps\registry.py", line 124, in check_apps_ready 
    raise AppRegistryNotReady("Apps aren't loaded yet.") 

aussehen wie jeder Prozess Import Conversion Modell und Conversion-Modell ist wie

from django.db import models 


    Conversion(model.Model): 

     conversion_name = models.CharField(max_length=63) 
     conversion_user = models.CharField(max_length=31) 
     conversion_description = models.TextField(blank=True) 
     ... 

Im Folgenden meine Beispielfunktion ist, die ich parallel wollen, jede Iteration ist unabhängig, aber werden die Daten in SQL zugreifen oder einfügen .

Class ConversionJob(): 
    ... 

    def run(self, p_list): 
     list_merge_result = [] 
     for p in p_list: 
      list_result = self.Couputing_api(p) 
      list_merge_result.extend(list_result) 

und ich versuche zu tun, ist

from multiprocessing import Pool 


Class ConversionJob(): 
     ... 
     def run(self, p_list): 
      list_merge_result = [] 

      p = Pool(process=4) 
      list_result = p.map(self.couputing_api, p_list) 
      list_merge_result.extend(list_result) 

In computing_api(), es werde versuchen, aktuelle Umwandlung der Informationen zu erhalten, die und vor diesem API-Aufruf speichern in SQL abgeschlossen hat, aber diese verursachte den Fehler.

Meine Frage ist

  • Warum Import Conversion Modell Apps verursacht werden, werden noch nicht fehlerfrei geladen, hatte ich viele Artikel google aber nicht wirklich meine Probleme zu lösen.
  • Ich kann jeden Prozess SpawnPoolWorker-X generiert sehen und versuchen, Django-Server wieder zu booten (warum?), Wird jeder Arbeiter bei den gleichen Fehlern stoppen.

  • Computing-API wird versuchen, auf SQL zugreifen, ich habe nicht darüber nachgedacht, wie man mit dieser Arbeit umgehen. (Teilen Sie DB-Verbindungen oder neue Verbindung in jedem Prozess)

+0

Tun Sie dies nicht. Verwenden Sie etwas wie Sellerie, um Offline-Jobs auszuführen. –

+0

Darf ich fragen, welche Probleme, wenn ich Multi-Processing verwende? Ich habe ein paar einfache Mathe-Berechnungen in Django ausprobiert, es ist Arbeit, aber wenn ich versuche, andere Module aufzurufen, wird es scheitern und mit diesem Fehler aufhören. –

+0

Ich weiß, das ist ungewöhnlich für eine Web-Anwendungen (synchrone Ausführung ), aber angenommen, ich möchte nur Anwendungen auf dem lokalen Rechner (127.0.0.1) installieren und nicht als Web-Server hosten. Gibt es eine Möglichkeit, die Rechenaufgabe durch Multi-Processing zu beschleunigen? –

Antwort

1

Dieser Beitrag kann das Problem lösen.

Django upgrading to 1.9 error “AppRegistryNotReady: Apps aren't loaded yet.”

Ich hatte diese Antwort vor gefunden, aber nicht wirklich zu dieser Zeit meine Probleme zu lösen.

Nachdem ich den Test wiederholt habe, muss ich diese Codes vor dem Import eines anderen Modells, hinzufügen, sonst wird untergeordneten Prozess booted fehlgeschlagen und geben Sie den Fehler.

import django 
django.setup() 
from another.app import models 
Verwandte Themen