Ich verwende die Python-Multiprocessing-Bibliothek, um mehrere Prozesse zu generieren, die jeweils in eine gemeinsame (MongoDB) -Datenbank schreiben. Ist das sicher, oder werden sich die Schreibvorgänge gegenseitig überschreiben?Können konkurrierende Prozesse in eine gemeinsam genutzte Datenbank schreiben?
Antwort
So lange, wie Sie sicherstellen, dass eine separate Datenbankverbindung für jeden Arbeitsprozess zu schaffen, ist es vollkommen sicher mehrere Prozesse hat eine Datenbank zur gleichen Zeit zugreifen. Alle Abfragen, die Änderungen an der Datenbank vornehmen, werden einzeln angewendet, normalerweise in der Reihenfolge, in der sie von der Datenbank empfangen werden. Unter den meisten Situationen wird dies sicher sein, aber :
Wenn Ihre Prozesse sind alle nur Dokumente in die Datenbank einfügen, wird jeder Einsatz typischerweise ein separates Objekt erstellen.
Die Ausnahme ist, wenn Sie explizit ein
_id
für ein Dokument angeben, und dass Kennung bereits in der Sammlung verwendet wurde. Dies führt dazu, dass der Einsatz fehlschlägt. (Tun Sie das nicht: Lassen Sie_id
aus und MongoDB generiert immer einen eindeutigen Wert für Sie.)Wenn Ihre Prozesse Dokumente aus der Datenbank löschen, schlägt der Vorgang fehl, wenn ein anderer Prozess bereits gelöscht wurde das gleiche Objekt. (Dies ist jedoch nicht unbedingt ein Fehler; es bedeutet nur, dass jemand anderes vor Ihnen war.)
Wenn Ihre Prozesse Dokumente in der Datenbank aktualisieren, werden die Dinge düsterer.
Solange jeder Prozess ein anderes Dokument aktualisiert, Sie sind in Ordnung.
Wenn mehr Prozesse versuchen, das gleiche Dokument zur gleichen Zeit zu aktualisieren, starten benötigen Sie vorsichtig zu sein. Aktualisierungen, die die Werte eines Objekts ersetzen, werden der Reihenfolge nach angewendet, was dazu führen kann, dass von einem Prozess vorgenommene Änderungen unbeabsichtigt von einem anderen überschrieben werden. Sie sollten darauf achten, keine Felder anzugeben, die Sie nicht ändern möchten. Die Verwendung von MongoDBs update operators kann hilfreich sein, um komplexe Operationen atomar auszuführen, z. B. die numerischen Werte von Feldern zu ändern.
Beachten Sie, dass „zur gleichen Zeit“ bedeutet nicht notwendigerweise, dass Operationen bei auftreten genau zur gleichen Zeit. Es bedeutet allgemeiner, dass es eine "Überlappung" in der Zeit gibt, in der zwei Prozesse mit demselben Dokument arbeiten, z.
Process A Process B
--------- ---------
Reads object from DB ...
working... Reads object from DB
working... working...
updates object with changes working...
updates object with changes
In der obigen Situation ist es möglich, für einen Teil der durch Prozess A vorgenommenen Änderungen versehentlich durch Verfahren B.
Kurz überschrieben werden, ja es durchaus sinnvoll ist (und bevorzugt tatsächlich) zu lassen Ihre Datenbank kümmert sich um die Parallelität Ihrer Datenbankvorgänge.
Alle relevanten Datenbanktreiber (MongoDB enthalten) wird für Sie gleichzeitige Vorgänge automatisch handhaben.
- 1. Gemeinsam genutzte Vektoren in OpenMP
- 2. Gemeinsam genutzte Einstellungen lesen
- 3. Können Python-Prozesse Live-Objekte gemeinsam nutzen?
- 4. Eine dynamisch verknüpfte gemeinsam genutzte Bibliothek erweitern?
- 5. Gemeinsam genutzte Bibliothek Name Kollisionen
- 6. speichern Hashzuordnung Gemeinsam genutzte Einstellungen
- 7. Gemeinsam genutzte Festplatten mit COMPS
- 8. ALLGEMEINEN Block gemeinsam genutzte Variablen
- 9. Können Sie gemeinsam genutzte Zeiger mit Nicht-Zeiger-Datenelementen mischen?
- 10. Gemeinsam genutzte Modellvariable in inkompatiblem Format
- 11. Gemeinsam genutzte Vektorvariablen unter mehreren C++ - Dateien
- 12. Wie Sie eine gemeinsam genutzte Bibliothek in C++ einbinden? libORB_SLAM
- 13. Dilemma über gemeinsam genutzte Bibliotheken unter Unix
- 14. Crystal Reports, Unterberichte, und gemeinsam genutzte Variablen
- 15. Gemeinsam genutzte Bibliothek für MonoDroid und MonoTouch
- 16. Linux: Wie können Versionsinformationen in eine gemeinsam genutzte Bibliothek und Binärdatei eingebettet werden?
- 17. Android Speichern Gemeinsam genutzte Einstellungen Backup Agent
- 18. mehrere Prozesse in eine einzige Protokolldatei schreiben
- 19. NodeJs gemeinsam genutzte Objekte zwischen Prozessen
- 20. Wie Laufzeit gemeinsam genutzte Bibliotheken debuggen?
- 21. embedding absoluter Pfad für gemeinsam genutzte Bibliotheken
- 22. Android: makeSceneTransition für mehr als eine gemeinsam genutzte Elemente
- 23. Zugriff auf eine gemeinsam genutzte Ordner (die geschützt ist)
- 24. Können sich konkurrierende atomare Operationen gegenseitig verhungern?
- 25. Gemeinsam genutzte Benutzeroberfläche in einer anderen Szene mit Unity3D erstellen
- 26. Wie gemeinsam genutzte Daten in Meteor cordova mobile app
- 27. Mutex für Rails-Prozesse
- 28. CMake erhalten, um gemeinsam genutzte Bibliothek für MSVC zu erstellen
- 29. Linux, Mono, gemeinsam genutzte Bibliotheken und unaufgelöste Symbole
- 30. Reagieren js und PropTypes Wiederholung über gemeinsam genutzte Komponenten
Was passiert, wenn Sie für alle Worker-Prozesse dieselbe Verbindung verwenden? – Jessica
@Jessica Schlechte Dinge. (Mehrere Prozesse versuchen möglicherweise gleichzeitig, in die Verbindung zu schreiben, und MongoDB wird ein Durcheinander bekommen und wahrscheinlich nur die Verbindung abbrechen.) Also tu das nicht. :) – duskwuff