Hintergrund:
Ich arbeite an einem Projekt, das Django mit einer Postgres-Datenbank verwendet. Wir verwenden auch mod_wsgi, falls dies wichtig ist, da einige meiner Websuchen dies erwähnt haben. Beim Senden eines Webformulars startet die Django-Ansicht einen Job, der viel Zeit in Anspruch nimmt (mehr als der Benutzer warten möchte). Daher starten wir den Job über einen Systemaufruf im Hintergrund. Der Job, der jetzt ausgeführt wird, muss lesen und in die Datenbank schreiben können. Da dieser Job so lange dauert, verwenden wir Multiprocessing, um Teile davon parallel auszuführen.
Problem:
Das Skript der obersten Ebene verfügt über eine Datenbankverbindung. Wenn untergeordnete Prozesse ausgelöst werden, scheint die Verbindung des übergeordneten Elements für die untergeordneten Prozesse verfügbar zu sein. Dann gibt es eine Ausnahme darüber, wie SET TRANSACTION ISOLATION LEVEL vor einer Abfrage aufgerufen werden muss. Untersuchungen haben ergeben, dass dies auf den Versuch zurückzuführen ist, dieselbe Datenbankverbindung in mehreren Prozessen zu verwenden. Ein Thread, den ich gefunden habe, schlug vor, connection.close () zu Beginn der untergeordneten Prozesse aufzurufen, damit Django automatisch eine neue Verbindung erstellt, wenn eine benötigt wird, und daher jeder untergeordnete Prozess eine eindeutige Verbindung hat - dh nicht gemeinsam genutzt wird. Dies hat bei mir nicht funktioniert, da der Aufruf von connection.close () im untergeordneten Prozess dazu führte, dass sich der übergeordnete Prozess beschwerte, dass die Verbindung unterbrochen wurde.
Weitere Ergebnisse:
Einige Dinge, die ich gelesen habe, scheinen darauf hinzudeuten, dass man das nicht wirklich kann und dass Multiprocessing, mod_wsgi und Django nicht gut zusammenspielen. Das scheint nur schwer zu glauben, denke ich.
Einige schlugen vor, Sellerie zu verwenden, was eine langfristige Lösung sein könnte, aber ich kann Sellerie derzeit nicht installieren, bis einige Genehmigungsverfahren abgeschlossen sind. Daher ist dies derzeit keine Option.
In SO und anderswo wurden mehrere Referenzen zu dauerhaften Datenbankverbindungen gefunden, die meines Erachtens ein anderes Problem darstellen.
Auch Verweise auf psycopg2.pool und pgpool und etwas über Türsteher gefunden. Zugegeben, ich habe das meiste, was ich darüber las, nicht verstanden, aber es hat mich mit Sicherheit nicht als das herausgesprungen, wonach ich gesucht habe.
Aktuelle "Work-Around":
Im Moment habe ich mich wieder darauf konzentriert, Dinge nur seriell auszuführen, und es funktioniert, ist aber langsamer als ich es gerne hätte.
Irgendwelche Vorschläge, wie ich Multiprocessing verwenden kann, um parallel zu laufen? Es scheint, als ob die Eltern und zwei Kinder unabhängige Verbindungen zur Datenbank haben könnten. Die Dinge wären in Ordnung, aber ich kann dieses Verhalten anscheinend nicht verstehen.
Danke und Entschuldigung für die Länge!