Moin, moin...
Ich möchte in parallel ablaufenden Threads einen Zugriff auf eine Postgres DB realisieren.
Man kann ja in jedem Thread eine neue Connection aufbauen oder aber eine bestehende Connection nutzen und in dem jeweiligen Thread einen neuen Cursor zu erzeugen.
Jetzt stellt sich mir die Frage, welcher Methode ich den Vorzug geben soll.
DB Version: "PostgreSQL 9.5.13 on x86_64-pc-linux-gnu (Ubuntu 9.5.13-2.pgdg16.04+1), compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609, 64-bit"
genutztes Python Modul: psycopg2 2.7.4
Zugriff: lesen & schreiben
Welcher Variante würdet Ihr den Vorzug geben?
Was muss ich jeweils beachten?
Vielen Dank schon einmal im Voraus für Eure Meinungen!
Datenbankzugriff in Threads
Die Methode ganz ohne Threads ist die beste. Warum willst du parallel abfragen? Python parallelisiert mit Threads eh schlecht, und das die DB Daten parallel schneller ausliefert ist zwar nicht unmöglich, aber auch nicht garantiert.
Nicht der DB Zugriff soll durch die Threads beschleunigt werden.
Im konkreten Fall lade ich mehrere Webseiten herunter , werte diese aus und das Ergebnis soll jetzt in eine DB geschrieben werden.
Die parallele Verarbeitung, speziell der Downloads, beschleunigt den gesamten Vorgang ungemein.
Im konkreten Fall lade ich mehrere Webseiten herunter , werte diese aus und das Ergebnis soll jetzt in eine DB geschrieben werden.
Die parallele Verarbeitung, speziell der Downloads, beschleunigt den gesamten Vorgang ungemein.
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Als erstes müsstest Du schauen was das `threadsafety`-Attribut vom Modul erlaubt. Bei `psycopg2` müsste das 2 sein, also „Threads may share the module and connections.“ — `Cursor` müssen also im jeweiligen Thread erstellt werden.
Ich würde eine Verbindung pro Thread erstellen. Denn wenn auch geschrieben werden soll, wird das mit den Transaktionen sonst interessant. Also solange das nicht ”natürlich” funktioniert. Also das die Threads beispielsweise alle am selben Problem arbeiten und ein Thread dann dafür zuständig ist die Transaktion für alle abzuschliessen.
An der Stelle mache ich dann auch immer noch Werbung für SQLAlchemy.
Ich würde eine Verbindung pro Thread erstellen. Denn wenn auch geschrieben werden soll, wird das mit den Transaktionen sonst interessant. Also solange das nicht ”natürlich” funktioniert. Also das die Threads beispielsweise alle am selben Problem arbeiten und ein Thread dann dafür zuständig ist die Transaktion für alle abzuschliessen.
An der Stelle mache ich dann auch immer noch Werbung für SQLAlchemy.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman