Psycopg2 / libpq-Verbindungen über Prozesse freigeben

Nach psycopg2 docs :

libpq Verbindungen sollten nicht von einem gegabelten Prozess verwendet werden , also bei der Verwendung eines Moduls wie multiprocessing oder einer Forking-Web-Bereitstellung Methode wie FastCGI stellen Sie sicher, die Verbindungen nach der Gabel zu erstellen.

Nach dem Link aus diesem Dokument führt man zu:

Bei Unix kann ein Forcieren eines Prozesses mit offenen libpq Verbindungen zu unvorhersehbaren Ergebnissen führen, da die übergeordneten und untergeordneten Prozesse dieselben Sockets und Betriebssystemressourcen teilen. Aus diesem Grund wird eine solche Verwendung nicht empfohlen, obwohl ein exec aus dem untergeordneten Prozess zum Laden einer neuen ausführbaren Datei ist sicher.

Aber es scheint, dass es kein inhärentes Problem bei der Bearbeitung von Prozessen mit offenen Steckdosen gibt. Also, was ist der Grund für die Warnung von psycopg2 gegen die Forking, wenn die Verbindungen offen sind?

Der Grund für meine Frage ist, dass ich einen (vermutlich erfolgreichen) Multiprocessing-Ansatz gesehen habe , der eine Verbindung direkt vor dem Forking eröffnete.

Vielleicht ist es sicher, offene Verbindungen unter einigen Einschränkungen zu machen (zB nur ein Prozess benutzt jemals die Verbindung usw.)?

One Solution collect form web for “Psycopg2 / libpq-Verbindungen über Prozesse freigeben”

Ihre Vermutung ist grundsätzlich richtig: Es gibt kein Problem mit einer Verbindung, die vor einer Gabel geöffnet wird, solange Sie nicht versuchen, es in mehr als einem Prozess zu verwenden.

Das heißt, ich glaube, Sie haben den "Multiprocessing-Ansatz" Link, den Sie zur Verfügung gestellt haben, missverstanden. Es zeigt tatsächlich eine separate Verbindung, die in jedem Kind geöffnet wird. (Es gibt eine Verbindung, die vom Elternteil vor dem Forking geöffnet wird, aber es wird nicht bei jedem Kind benutzt.)

Die Verbesserung, die durch die Antwort dort gegeben wurde (gegenüber dem Code in der Frage), war, um zu refactor, dass – anstatt eine neue Verbindung für jede Aufgabe in der Warteschlange zu öffnen – jeder Kindprozess eine einzige Verbindung eröffnete und dann über mehrere Aufgaben teilte Innerhalb des gleichen Kindes ausgeführt (dh die Verbindung wird als Argument an den Task-Prozessor übergeben).

Bearbeiten :
Als allgemeine Praxis sollte man es vorziehen, eine Verbindung innerhalb des Prozesses zu schaffen, der sie benutzt. In der Antwort zitiert, wurde eine Verbindung in der Eltern vor dem Forking erstellt, dann im Kind verwendet. Das geht gut, aber lässt jede "Kind-Verbindung" auch im Elternteil offen, was im besten Fall eine Verschwendung von Ressourcen und auch eine mögliche Ursache von Bugs ist.

  • Lesen von JAVA-Buchse langsamer als Python
  • Senden von serialisierten Daten von Client zu Server in Python
  • Sudo Command mit Paramiko ausführen
  • Mit pygame zu strömen über sockets in python error
  • Senden von Daten aus dem Python-Programm in das Java-Programm
  • Tor, Stiel und Sockets - Identität ändern mit TOR
  • Was könnte der Grund für einen Socket-Fehler sein "[Errno 9] Bad file deskriptor"
  • Python-Threading hängen?
  • Wie finde ich die ips im Netzwerk in Python
  • Python Client Server Transfer .txt nicht in Datei schreiben
  • Python asyncio laufen event loop einmal?
  • Python ist die beste Programmiersprache der Welt.