Ich laufe immer wieder in seltsame mysql-Probleme, während Arbeiter Aufgaben direkt nach der Erstellung ausführen.Erstellen einer separaten Datenbankverbindung für jeden Sellerie-Arbeiter
Wir verwenden django 1.3, Sellerie 3.1.17, djorm-ext-pool 0,5
Wir beginnen Sellerie Prozess mit Concurrency 3. Mein obeservation weit so ist, dann, wenn der Arbeitnehmer Prozessstart, alle gleiche mysql erhalten Verbindung. Wir protokollieren die Db-Verbindungs-ID wie folgt.
from django.db import connection
connection.cursor()
logger.info("Task %s processing with db connection %s", str(task_id), str(connection.connection.thread_id()))
Wenn alle Arbeiter Aufgaben erhalten, wird die erste erfolgreich ausgeführt, aber die anderen zwei ergeben seltsame Mysql-Fehler. Es sind entweder Fehler mit "Mysql Server weggegangen", oder mit einer Bedingung, wo Django "DoesNotExist" Fehler wirft. eindeutig existieren die Objekte, die Django abfragt.
Nach diesem Fehler beginnt jeder Worker, eine eigene Datenbankverbindung zu erhalten, nach der wir kein Problem finden.
Wie ist das Standardverhalten von Sellerie? Ist es entworfen, um die gleiche Datenbankverbindung zu teilen. Wenn ja, wie wird die Kommunikation zwischen den Prozessen gehandhabt? Ich würde idealerweise unterschiedliche Datenbankverbindung für jeden Arbeiter bevorzugen.
Ich versuchte den unten genannten Code, der nicht funktioniert hat. Celery Worker Database Connection Pooling
Wir haben auch den unten empfohlenen Sellerie-Code korrigiert. https://github.com/celery/celery/issues/2453
Für diejenigen, die die Frage herunterschwenken, lassen Sie mich bitte den Grund für den Downvote wissen.
Verwenden Sie eine Django-Verbindungspooling-Middleware? Was ist deine 'CONN_MAX_AGE' in der Django-Konfiguration? Ich denke, das beeinflusst das dauerhafte Verbindungsverhalten in Django. Dies könnte mit dem Verhalten zusammenhängen, das Sie sehen, nicht mit Sellerie. –
Konnten Sie einfach concurrency = 1 ausführen und mehrere Worker starten? –
@AlexLuisArias Das würde nur einen Worker-Prozess ausführen und ist kein Fall für das obige Problem. –